0xe7fd /* b .-2 */
};
-/* The entries in a PLT when using a DLL-based target with multiple
- address spaces. */
-static const bfd_vma elf32_arm_symbian_plt_entry [] =
-{
- 0xe51ff004, /* ldr pc, [pc, #-4] */
- 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
-};
-
/* The first entry in a procedure linkage table looks like
this. It is set up so that any shared library function that is
called before the relocation has been set up calls the dynamic
if (htab == NULL)
return FALSE;
- /* BPABI objects never have a GOT, or associated sections. */
- if (htab->root.target_os == is_symbian)
- return TRUE;
-
if (! _bfd_elf_create_got_section (dynobj, info))
return FALSE;
root_plt->offset = splt->size;
splt->size += htab->plt_entry_size;
- if (htab->root.target_os != is_symbian)
- {
- /* We also need to make an entry in the .got.plt section, which
- will be placed in the .got section by the linker script. */
- if (is_iplt_entry)
- arm_plt->got_offset = sgotplt->size;
- else
- arm_plt->got_offset = sgotplt->size - 8 * htab->num_tls_desc;
- if (htab->fdpic_p)
- /* Function descriptor takes 64 bits in GOT. */
- sgotplt->size += 8;
- else
- sgotplt->size += 4;
- }
+ /* We also need to make an entry in the .got.plt section, which
+ will be placed in the .got section by the linker script. */
+ if (is_iplt_entry)
+ arm_plt->got_offset = sgotplt->size;
+ else
+ arm_plt->got_offset = sgotplt->size - 8 * htab->num_tls_desc;
+ if (htab->fdpic_p)
+ /* Function descriptor takes 64 bits in GOT. */
+ sgotplt->size += 8;
+ else
+ sgotplt->size += 4;
}
static bfd_vma
bfd_byte *loc;
bfd_vma plt_index;
Elf_Internal_Rela rel;
- bfd_vma plt_header_size;
bfd_vma got_header_size;
htab = elf32_arm_hash_table (info);
/* There are no reserved entries in .igot.plt, and no special
first entry in .iplt. */
got_header_size = 0;
- plt_header_size = 0;
}
else
{
srel = htab->root.srelplt;
got_header_size = get_elf_backend_data (output_bfd)->got_header_size;
- plt_header_size = htab->plt_header_size;
}
BFD_ASSERT (splt != NULL && srel != NULL);
- /* Fill in the entry in the procedure linkage table. */
- if (htab->root.target_os == is_symbian)
+ bfd_vma got_offset, got_address, plt_address;
+ bfd_vma got_displacement, initial_got_entry;
+ bfd_byte * ptr;
+
+ BFD_ASSERT (sgot != NULL);
+
+ /* Get the offset into the .(i)got.plt table of the entry that
+ corresponds to this function. */
+ got_offset = (arm_plt->got_offset & -2);
+
+ /* Get the index in the procedure linkage table which
+ corresponds to this symbol. This is the index of this symbol
+ in all the symbols for which we are making plt entries.
+ After the reserved .got.plt entries, all symbols appear in
+ the same order as in .plt. */
+ if (htab->fdpic_p)
+ /* Function descriptor takes 8 bytes. */
+ plt_index = (got_offset - got_header_size) / 8;
+ else
+ plt_index = (got_offset - got_header_size) / 4;
+
+ /* Calculate the address of the GOT entry. */
+ got_address = (sgot->output_section->vma
+ + sgot->output_offset
+ + got_offset);
+
+ /* ...and the address of the PLT entry. */
+ plt_address = (splt->output_section->vma
+ + splt->output_offset
+ + root_plt->offset);
+
+ ptr = splt->contents + root_plt->offset;
+ if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
{
- BFD_ASSERT (dynindx >= 0);
- put_arm_insn (htab, output_bfd,
- elf32_arm_symbian_plt_entry[0],
- splt->contents + root_plt->offset);
- bfd_put_32 (output_bfd,
- elf32_arm_symbian_plt_entry[1],
- splt->contents + root_plt->offset + 4);
-
- /* Fill in the entry in the .rel.plt section. */
- rel.r_offset = (splt->output_section->vma
- + splt->output_offset
- + root_plt->offset + 4);
- rel.r_info = ELF32_R_INFO (dynindx, R_ARM_GLOB_DAT);
-
- /* Get the index in the procedure linkage table which
- corresponds to this symbol. This is the index of this symbol
- in all the symbols for which we are making plt entries. The
- first entry in the procedure linkage table is reserved. */
- plt_index = ((root_plt->offset - plt_header_size)
- / htab->plt_entry_size);
+ unsigned int i;
+ bfd_vma val;
+
+ for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
+ {
+ val = elf32_arm_vxworks_shared_plt_entry[i];
+ if (i == 2)
+ val |= got_address - sgot->output_section->vma;
+ if (i == 5)
+ val |= plt_index * RELOC_SIZE (htab);
+ if (i == 2 || i == 5)
+ bfd_put_32 (output_bfd, val, ptr);
+ else
+ put_arm_insn (htab, output_bfd, val, ptr);
+ }
}
- else
+ else if (htab->root.target_os == is_vxworks)
{
- bfd_vma got_offset, got_address, plt_address;
- bfd_vma got_displacement, initial_got_entry;
- bfd_byte * ptr;
+ unsigned int i;
+ bfd_vma val;
- BFD_ASSERT (sgot != NULL);
+ for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
+ {
+ val = elf32_arm_vxworks_exec_plt_entry[i];
+ if (i == 2)
+ val |= got_address;
+ if (i == 4)
+ val |= 0xffffff & -((root_plt->offset + i * 4 + 8) >> 2);
+ if (i == 5)
+ val |= plt_index * RELOC_SIZE (htab);
+ if (i == 2 || i == 5)
+ bfd_put_32 (output_bfd, val, ptr);
+ else
+ put_arm_insn (htab, output_bfd, val, ptr);
+ }
- /* Get the offset into the .(i)got.plt table of the entry that
- corresponds to this function. */
- got_offset = (arm_plt->got_offset & -2);
+ loc = (htab->srelplt2->contents
+ + (plt_index * 2 + 1) * RELOC_SIZE (htab));
- /* Get the index in the procedure linkage table which
- corresponds to this symbol. This is the index of this symbol
- in all the symbols for which we are making plt entries.
- After the reserved .got.plt entries, all symbols appear in
- the same order as in .plt. */
- if (htab->fdpic_p)
- /* Function descriptor takes 8 bytes. */
- plt_index = (got_offset - got_header_size) / 8;
- else
- plt_index = (got_offset - got_header_size) / 4;
+ /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
+ referencing the GOT for this PLT entry. */
+ rel.r_offset = plt_address + 8;
+ rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
+ rel.r_addend = got_offset;
+ SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
+ loc += RELOC_SIZE (htab);
- /* Calculate the address of the GOT entry. */
- got_address = (sgot->output_section->vma
- + sgot->output_offset
- + got_offset);
+ /* Create the R_ARM_ABS32 relocation referencing the
+ beginning of the PLT for this GOT entry. */
+ rel.r_offset = got_address;
+ rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
+ rel.r_addend = 0;
+ SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
+ }
+ else if (htab->root.target_os == is_nacl)
+ {
+ /* Calculate the displacement between the PLT slot and the
+ common tail that's part of the special initial PLT slot. */
+ int32_t tail_displacement
+ = ((splt->output_section->vma + splt->output_offset
+ + ARM_NACL_PLT_TAIL_OFFSET)
+ - (plt_address + htab->plt_entry_size + 4));
+ BFD_ASSERT ((tail_displacement & 3) == 0);
+ tail_displacement >>= 2;
- /* ...and the address of the PLT entry. */
- plt_address = (splt->output_section->vma
- + splt->output_offset
- + root_plt->offset);
+ BFD_ASSERT ((tail_displacement & 0xff000000) == 0
+ || (-tail_displacement & 0xff000000) == 0);
- ptr = splt->contents + root_plt->offset;
- if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
- {
- unsigned int i;
- bfd_vma val;
+ /* Calculate the displacement between the PLT slot and the entry
+ in the GOT. The offset accounts for the value produced by
+ adding to pc in the penultimate instruction of the PLT stub. */
+ got_displacement = (got_address
+ - (plt_address + htab->plt_entry_size));
- for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
- {
- val = elf32_arm_vxworks_shared_plt_entry[i];
- if (i == 2)
- val |= got_address - sgot->output_section->vma;
- if (i == 5)
- val |= plt_index * RELOC_SIZE (htab);
- if (i == 2 || i == 5)
- bfd_put_32 (output_bfd, val, ptr);
- else
- put_arm_insn (htab, output_bfd, val, ptr);
- }
+ /* NaCl does not support interworking at all. */
+ BFD_ASSERT (!elf32_arm_plt_needs_thumb_stub_p (info, arm_plt));
+
+ put_arm_insn (htab, output_bfd,
+ elf32_arm_nacl_plt_entry[0]
+ | arm_movw_immediate (got_displacement),
+ ptr + 0);
+ put_arm_insn (htab, output_bfd,
+ elf32_arm_nacl_plt_entry[1]
+ | arm_movt_immediate (got_displacement),
+ ptr + 4);
+ put_arm_insn (htab, output_bfd,
+ elf32_arm_nacl_plt_entry[2],
+ ptr + 8);
+ put_arm_insn (htab, output_bfd,
+ elf32_arm_nacl_plt_entry[3]
+ | (tail_displacement & 0x00ffffff),
+ ptr + 12);
+ }
+ else if (htab->fdpic_p)
+ {
+ const bfd_vma *plt_entry = using_thumb_only(htab)
+ ? elf32_arm_fdpic_thumb_plt_entry
+ : elf32_arm_fdpic_plt_entry;
+
+ /* Fill-up Thumb stub if needed. */
+ if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
+ {
+ put_thumb_insn (htab, output_bfd,
+ elf32_arm_plt_thumb_stub[0], ptr - 4);
+ put_thumb_insn (htab, output_bfd,
+ elf32_arm_plt_thumb_stub[1], ptr - 2);
}
- else if (htab->root.target_os == is_vxworks)
+ /* As we are using 32 bit instructions even for the Thumb
+ version, we have to use 'put_arm_insn' instead of
+ 'put_thumb_insn'. */
+ put_arm_insn(htab, output_bfd, plt_entry[0], ptr + 0);
+ put_arm_insn(htab, output_bfd, plt_entry[1], ptr + 4);
+ put_arm_insn(htab, output_bfd, plt_entry[2], ptr + 8);
+ put_arm_insn(htab, output_bfd, plt_entry[3], ptr + 12);
+ bfd_put_32 (output_bfd, got_offset, ptr + 16);
+
+ if (!(info->flags & DF_BIND_NOW))
{
- unsigned int i;
- bfd_vma val;
-
- for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
- {
- val = elf32_arm_vxworks_exec_plt_entry[i];
- if (i == 2)
- val |= got_address;
- if (i == 4)
- val |= 0xffffff & -((root_plt->offset + i * 4 + 8) >> 2);
- if (i == 5)
- val |= plt_index * RELOC_SIZE (htab);
- if (i == 2 || i == 5)
- bfd_put_32 (output_bfd, val, ptr);
- else
- put_arm_insn (htab, output_bfd, val, ptr);
- }
+ /* funcdesc_value_reloc_offset. */
+ bfd_put_32 (output_bfd,
+ htab->root.srelplt->reloc_count * RELOC_SIZE (htab),
+ ptr + 20);
+ put_arm_insn(htab, output_bfd, plt_entry[6], ptr + 24);
+ put_arm_insn(htab, output_bfd, plt_entry[7], ptr + 28);
+ put_arm_insn(htab, output_bfd, plt_entry[8], ptr + 32);
+ put_arm_insn(htab, output_bfd, plt_entry[9], ptr + 36);
+ }
+ }
+ else if (using_thumb_only (htab))
+ {
+ /* PR ld/16017: Generate thumb only PLT entries. */
+ if (!using_thumb2 (htab))
+ {
+ /* FIXME: We ought to be able to generate thumb-1 PLT
+ instructions... */
+ _bfd_error_handler (_("%pB: warning: thumb-1 mode PLT generation not currently supported"),
+ output_bfd);
+ return FALSE;
+ }
- loc = (htab->srelplt2->contents
- + (plt_index * 2 + 1) * RELOC_SIZE (htab));
+ /* Calculate the displacement between the PLT slot and the entry in
+ the GOT. The 12-byte offset accounts for the value produced by
+ adding to pc in the 3rd instruction of the PLT stub. */
+ got_displacement = got_address - (plt_address + 12);
- /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
- referencing the GOT for this PLT entry. */
- rel.r_offset = plt_address + 8;
- rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
- rel.r_addend = got_offset;
- SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
- loc += RELOC_SIZE (htab);
+ /* As we are using 32 bit instructions we have to use 'put_arm_insn'
+ instead of 'put_thumb_insn'. */
+ put_arm_insn (htab, output_bfd,
+ elf32_thumb2_plt_entry[0]
+ | ((got_displacement & 0x000000ff) << 16)
+ | ((got_displacement & 0x00000700) << 20)
+ | ((got_displacement & 0x00000800) >> 1)
+ | ((got_displacement & 0x0000f000) >> 12),
+ ptr + 0);
+ put_arm_insn (htab, output_bfd,
+ elf32_thumb2_plt_entry[1]
+ | ((got_displacement & 0x00ff0000) )
+ | ((got_displacement & 0x07000000) << 4)
+ | ((got_displacement & 0x08000000) >> 17)
+ | ((got_displacement & 0xf0000000) >> 28),
+ ptr + 4);
+ put_arm_insn (htab, output_bfd,
+ elf32_thumb2_plt_entry[2],
+ ptr + 8);
+ put_arm_insn (htab, output_bfd,
+ elf32_thumb2_plt_entry[3],
+ ptr + 12);
+ }
+ else
+ {
+ /* Calculate the displacement between the PLT slot and the
+ entry in the GOT. The eight-byte offset accounts for the
+ value produced by adding to pc in the first instruction
+ of the PLT stub. */
+ got_displacement = got_address - (plt_address + 8);
- /* Create the R_ARM_ABS32 relocation referencing the
- beginning of the PLT for this GOT entry. */
- rel.r_offset = got_address;
- rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
- rel.r_addend = 0;
- SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
+ if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
+ {
+ put_thumb_insn (htab, output_bfd,
+ elf32_arm_plt_thumb_stub[0], ptr - 4);
+ put_thumb_insn (htab, output_bfd,
+ elf32_arm_plt_thumb_stub[1], ptr - 2);
}
- else if (htab->root.target_os == is_nacl)
+
+ if (!elf32_arm_use_long_plt_entry)
{
- /* Calculate the displacement between the PLT slot and the
- common tail that's part of the special initial PLT slot. */
- int32_t tail_displacement
- = ((splt->output_section->vma + splt->output_offset
- + ARM_NACL_PLT_TAIL_OFFSET)
- - (plt_address + htab->plt_entry_size + 4));
- BFD_ASSERT ((tail_displacement & 3) == 0);
- tail_displacement >>= 2;
-
- BFD_ASSERT ((tail_displacement & 0xff000000) == 0
- || (-tail_displacement & 0xff000000) == 0);
-
- /* Calculate the displacement between the PLT slot and the entry
- in the GOT. The offset accounts for the value produced by
- adding to pc in the penultimate instruction of the PLT stub. */
- got_displacement = (got_address
- - (plt_address + htab->plt_entry_size));
-
- /* NaCl does not support interworking at all. */
- BFD_ASSERT (!elf32_arm_plt_needs_thumb_stub_p (info, arm_plt));
+ BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
put_arm_insn (htab, output_bfd,
- elf32_arm_nacl_plt_entry[0]
- | arm_movw_immediate (got_displacement),
+ elf32_arm_plt_entry_short[0]
+ | ((got_displacement & 0x0ff00000) >> 20),
ptr + 0);
put_arm_insn (htab, output_bfd,
- elf32_arm_nacl_plt_entry[1]
- | arm_movt_immediate (got_displacement),
- ptr + 4);
+ elf32_arm_plt_entry_short[1]
+ | ((got_displacement & 0x000ff000) >> 12),
+ ptr+ 4);
put_arm_insn (htab, output_bfd,
- elf32_arm_nacl_plt_entry[2],
+ elf32_arm_plt_entry_short[2]
+ | (got_displacement & 0x00000fff),
ptr + 8);
- put_arm_insn (htab, output_bfd,
- elf32_arm_nacl_plt_entry[3]
- | (tail_displacement & 0x00ffffff),
- ptr + 12);
- }
- else if (htab->fdpic_p)
- {
- const bfd_vma *plt_entry = using_thumb_only(htab)
- ? elf32_arm_fdpic_thumb_plt_entry
- : elf32_arm_fdpic_plt_entry;
-
- /* Fill-up Thumb stub if needed. */
- if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
- {
- put_thumb_insn (htab, output_bfd,
- elf32_arm_plt_thumb_stub[0], ptr - 4);
- put_thumb_insn (htab, output_bfd,
- elf32_arm_plt_thumb_stub[1], ptr - 2);
- }
- /* As we are using 32 bit instructions even for the Thumb
- version, we have to use 'put_arm_insn' instead of
- 'put_thumb_insn'. */
- put_arm_insn(htab, output_bfd, plt_entry[0], ptr + 0);
- put_arm_insn(htab, output_bfd, plt_entry[1], ptr + 4);
- put_arm_insn(htab, output_bfd, plt_entry[2], ptr + 8);
- put_arm_insn(htab, output_bfd, plt_entry[3], ptr + 12);
- bfd_put_32 (output_bfd, got_offset, ptr + 16);
-
- if (!(info->flags & DF_BIND_NOW))
- {
- /* funcdesc_value_reloc_offset. */
- bfd_put_32 (output_bfd,
- htab->root.srelplt->reloc_count * RELOC_SIZE (htab),
- ptr + 20);
- put_arm_insn(htab, output_bfd, plt_entry[6], ptr + 24);
- put_arm_insn(htab, output_bfd, plt_entry[7], ptr + 28);
- put_arm_insn(htab, output_bfd, plt_entry[8], ptr + 32);
- put_arm_insn(htab, output_bfd, plt_entry[9], ptr + 36);
- }
+#ifdef FOUR_WORD_PLT
+ bfd_put_32 (output_bfd, elf32_arm_plt_entry_short[3], ptr + 12);
+#endif
}
- else if (using_thumb_only (htab))
+ else
{
- /* PR ld/16017: Generate thumb only PLT entries. */
- if (!using_thumb2 (htab))
- {
- /* FIXME: We ought to be able to generate thumb-1 PLT
- instructions... */
- _bfd_error_handler (_("%pB: warning: thumb-1 mode PLT generation not currently supported"),
- output_bfd);
- return FALSE;
- }
-
- /* Calculate the displacement between the PLT slot and the entry in
- the GOT. The 12-byte offset accounts for the value produced by
- adding to pc in the 3rd instruction of the PLT stub. */
- got_displacement = got_address - (plt_address + 12);
-
- /* As we are using 32 bit instructions we have to use 'put_arm_insn'
- instead of 'put_thumb_insn'. */
put_arm_insn (htab, output_bfd,
- elf32_thumb2_plt_entry[0]
- | ((got_displacement & 0x000000ff) << 16)
- | ((got_displacement & 0x00000700) << 20)
- | ((got_displacement & 0x00000800) >> 1)
- | ((got_displacement & 0x0000f000) >> 12),
+ elf32_arm_plt_entry_long[0]
+ | ((got_displacement & 0xf0000000) >> 28),
ptr + 0);
put_arm_insn (htab, output_bfd,
- elf32_thumb2_plt_entry[1]
- | ((got_displacement & 0x00ff0000) )
- | ((got_displacement & 0x07000000) << 4)
- | ((got_displacement & 0x08000000) >> 17)
- | ((got_displacement & 0xf0000000) >> 28),
+ elf32_arm_plt_entry_long[1]
+ | ((got_displacement & 0x0ff00000) >> 20),
ptr + 4);
put_arm_insn (htab, output_bfd,
- elf32_thumb2_plt_entry[2],
- ptr + 8);
+ elf32_arm_plt_entry_long[2]
+ | ((got_displacement & 0x000ff000) >> 12),
+ ptr+ 8);
put_arm_insn (htab, output_bfd,
- elf32_thumb2_plt_entry[3],
+ elf32_arm_plt_entry_long[3]
+ | (got_displacement & 0x00000fff),
ptr + 12);
}
- else
- {
- /* Calculate the displacement between the PLT slot and the
- entry in the GOT. The eight-byte offset accounts for the
- value produced by adding to pc in the first instruction
- of the PLT stub. */
- got_displacement = got_address - (plt_address + 8);
-
- if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
- {
- put_thumb_insn (htab, output_bfd,
- elf32_arm_plt_thumb_stub[0], ptr - 4);
- put_thumb_insn (htab, output_bfd,
- elf32_arm_plt_thumb_stub[1], ptr - 2);
- }
-
- if (!elf32_arm_use_long_plt_entry)
- {
- BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
-
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_short[0]
- | ((got_displacement & 0x0ff00000) >> 20),
- ptr + 0);
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_short[1]
- | ((got_displacement & 0x000ff000) >> 12),
- ptr+ 4);
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_short[2]
- | (got_displacement & 0x00000fff),
- ptr + 8);
-#ifdef FOUR_WORD_PLT
- bfd_put_32 (output_bfd, elf32_arm_plt_entry_short[3], ptr + 12);
-#endif
- }
- else
- {
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_long[0]
- | ((got_displacement & 0xf0000000) >> 28),
- ptr + 0);
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_long[1]
- | ((got_displacement & 0x0ff00000) >> 20),
- ptr + 4);
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_long[2]
- | ((got_displacement & 0x000ff000) >> 12),
- ptr+ 8);
- put_arm_insn (htab, output_bfd,
- elf32_arm_plt_entry_long[3]
- | (got_displacement & 0x00000fff),
- ptr + 12);
- }
- }
+ }
- /* Fill in the entry in the .rel(a).(i)plt section. */
- rel.r_offset = got_address;
- rel.r_addend = 0;
- if (dynindx == -1)
+ /* Fill in the entry in the .rel(a).(i)plt section. */
+ rel.r_offset = got_address;
+ rel.r_addend = 0;
+ if (dynindx == -1)
+ {
+ /* .igot.plt entries use IRELATIVE relocations against SYM_VALUE.
+ The dynamic linker or static executable then calls SYM_VALUE
+ to determine the correct run-time value of the .igot.plt entry. */
+ rel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
+ initial_got_entry = sym_value;
+ }
+ else
+ {
+ /* For FDPIC we will have to resolve a R_ARM_FUNCDESC_VALUE
+ used by PLT entry. */
+ if (htab->fdpic_p)
{
- /* .igot.plt entries use IRELATIVE relocations against SYM_VALUE.
- The dynamic linker or static executable then calls SYM_VALUE
- to determine the correct run-time value of the .igot.plt entry. */
- rel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
- initial_got_entry = sym_value;
+ rel.r_info = ELF32_R_INFO (dynindx, R_ARM_FUNCDESC_VALUE);
+ initial_got_entry = 0;
}
else
{
- /* For FDPIC we will have to resolve a R_ARM_FUNCDESC_VALUE
- used by PLT entry. */
- if (htab->fdpic_p)
- {
- rel.r_info = ELF32_R_INFO (dynindx, R_ARM_FUNCDESC_VALUE);
- initial_got_entry = 0;
- }
- else
- {
- rel.r_info = ELF32_R_INFO (dynindx, R_ARM_JUMP_SLOT);
- initial_got_entry = (splt->output_section->vma
- + splt->output_offset);
-
- /* PR ld/16017
- When thumb only we need to set the LSB for any address that
- will be used with an interworking branch instruction. */
- if (using_thumb_only (htab))
- initial_got_entry |= 1;
- }
+ rel.r_info = ELF32_R_INFO (dynindx, R_ARM_JUMP_SLOT);
+ initial_got_entry = (splt->output_section->vma
+ + splt->output_offset);
+
+ /* PR ld/16017
+ When thumb only we need to set the LSB for any address that
+ will be used with an interworking branch instruction. */
+ if (using_thumb_only (htab))
+ initial_got_entry |= 1;
}
+ }
- /* Fill in the entry in the global offset table. */
- bfd_put_32 (output_bfd, initial_got_entry,
- sgot->contents + got_offset);
-
- if (htab->fdpic_p && !(info->flags & DF_BIND_NOW))
- {
- /* Setup initial funcdesc value. */
- /* FIXME: we don't support lazy binding because there is a
- race condition between both words getting written and
- some other thread attempting to read them. The ARM
- architecture does not have an atomic 64 bit load/store
- instruction that could be used to prevent it; it is
- recommended that threaded FDPIC applications run with the
- LD_BIND_NOW environment variable set. */
- bfd_put_32(output_bfd, plt_address + 0x18,
- sgot->contents + got_offset);
- bfd_put_32(output_bfd, -1 /*TODO*/,
- sgot->contents + got_offset + 4);
- }
+ /* Fill in the entry in the global offset table. */
+ bfd_put_32 (output_bfd, initial_got_entry,
+ sgot->contents + got_offset);
+
+ if (htab->fdpic_p && !(info->flags & DF_BIND_NOW))
+ {
+ /* Setup initial funcdesc value. */
+ /* FIXME: we don't support lazy binding because there is a
+ race condition between both words getting written and
+ some other thread attempting to read them. The ARM
+ architecture does not have an atomic 64 bit load/store
+ instruction that could be used to prevent it; it is
+ recommended that threaded FDPIC applications run with the
+ LD_BIND_NOW environment variable set. */
+ bfd_put_32(output_bfd, plt_address + 0x18,
+ sgot->contents + got_offset);
+ bfd_put_32(output_bfd, -1 /*TODO*/,
+ sgot->contents + got_offset + 4);
}
if (dynindx == -1)
/* This symbol is local, or marked to become local. */
BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI
|| (globals->fdpic_p && !bfd_link_pic(info)));
- if (globals->root.target_os == is_symbian)
- {
- asection *osec;
-
- /* On Symbian OS, the data segment and text segement
- can be relocated independently. Therefore, we
- must indicate the segment to which this
- relocation is relative. The BPABI allows us to
- use any symbol in the right segment; we just use
- the section symbol as it is convenient. (We
- cannot use the symbol given by "h" directly as it
- will not appear in the dynamic symbol table.)
-
- Note that the dynamic linker ignores the section
- symbol value, so we don't subtract osec->vma
- from the emitted reloc addend. */
- if (sym_sec)
- osec = sym_sec->output_section;
- else
- osec = input_section->output_section;
- symbol = 0;
- if (osec && elf_section_data (osec))
- symbol = elf_section_data (osec)->dynindx;
- if (symbol == 0)
- {
- struct elf_link_hash_table *htab = elf_hash_table (info);
-
- if ((osec->flags & SEC_READONLY) == 0
- && htab->data_index_section != NULL)
- osec = htab->data_index_section;
- else
- osec = htab->text_index_section;
- symbol = elf_section_data (osec)->dynindx;
- }
- BFD_ASSERT (symbol != 0);
- }
- else
- /* On SVR4-ish systems, the dynamic loader cannot
- relocate the text and data segments independently,
- so the symbol does not matter. */
- symbol = 0;
+ /* On SVR4-ish systems, the dynamic loader cannot
+ relocate the text and data segments independently,
+ so the symbol does not matter. */
+ symbol = 0;
if (dynreloc_st_type == STT_GNU_IFUNC)
/* We have an STT_GNU_IFUNC symbol that doesn't resolve
to the .iplt entry. Instead, every non-call reference
if (sreloc == NULL)
return FALSE;
-
- /* BPABI objects never have dynamic relocations mapped. */
- if (htab->root.target_os == is_symbian)
- {
- flagword flags;
-
- flags = bfd_section_flags (sreloc);
- flags &= ~(SEC_LOAD | SEC_ALLOC);
- bfd_set_section_flags (sreloc, flags);
- }
}
/* If this is a global symbol, count the number of
/* Make sure this symbol is output as a dynamic symbol.
Undefined weak syms won't yet be marked as dynamic. */
- if (htab->root.dynamic_sections_created && h->dynindx == -1 && !h->forced_local
+ if (htab->root.dynamic_sections_created
+ && h->dynindx == -1
+ && !h->forced_local
&& h->root.type == bfd_link_hash_undefweak)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
- if (htab->root.target_os != is_symbian)
- {
- s = htab->root.sgot;
- h->got.offset = s->size;
+ s = htab->root.sgot;
+ h->got.offset = s->size;
- if (tls_type == GOT_UNKNOWN)
- abort ();
+ if (tls_type == GOT_UNKNOWN)
+ abort ();
- if (tls_type == GOT_NORMAL)
- /* Non-TLS symbols need one GOT slot. */
- s->size += 4;
- else
+ if (tls_type == GOT_NORMAL)
+ /* Non-TLS symbols need one GOT slot. */
+ s->size += 4;
+ else
+ {
+ if (tls_type & GOT_TLS_GDESC)
{
- if (tls_type & GOT_TLS_GDESC)
- {
- /* R_ARM_TLS_DESC needs 2 GOT slots. */
- eh->tlsdesc_got
- = (htab->root.sgotplt->size
- - elf32_arm_compute_jump_table_size (htab));
- htab->root.sgotplt->size += 8;
- h->got.offset = (bfd_vma) -2;
- /* plt.got_offset needs to know there's a TLS_DESC
- reloc in the middle of .got.plt. */
- htab->num_tls_desc++;
- }
-
- if (tls_type & GOT_TLS_GD)
- {
- /* R_ARM_TLS_GD32 and R_ARM_TLS_GD32_FDPIC need two
- consecutive GOT slots. If the symbol is both GD
- and GDESC, got.offset may have been
- overwritten. */
- h->got.offset = s->size;
- s->size += 8;
- }
+ /* R_ARM_TLS_DESC needs 2 GOT slots. */
+ eh->tlsdesc_got
+ = (htab->root.sgotplt->size
+ - elf32_arm_compute_jump_table_size (htab));
+ htab->root.sgotplt->size += 8;
+ h->got.offset = (bfd_vma) -2;
+ /* plt.got_offset needs to know there's a TLS_DESC
+ reloc in the middle of .got.plt. */
+ htab->num_tls_desc++;
+ }
- if (tls_type & GOT_TLS_IE)
- /* R_ARM_TLS_IE32/R_ARM_TLS_IE32_FDPIC need one GOT
- slot. */
- s->size += 4;
+ if (tls_type & GOT_TLS_GD)
+ {
+ /* R_ARM_TLS_GD32 and R_ARM_TLS_GD32_FDPIC need two
+ consecutive GOT slots. If the symbol is both GD
+ and GDESC, got.offset may have been
+ overwritten. */
+ h->got.offset = s->size;
+ s->size += 8;
}
- dyn = htab->root.dynamic_sections_created;
+ if (tls_type & GOT_TLS_IE)
+ /* R_ARM_TLS_IE32/R_ARM_TLS_IE32_FDPIC need one GOT
+ slot. */
+ s->size += 4;
+ }
- indx = 0;
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
- bfd_link_pic (info),
- h)
- && (!bfd_link_pic (info)
- || !SYMBOL_REFERENCES_LOCAL (info, h)))
- indx = h->dynindx;
+ dyn = htab->root.dynamic_sections_created;
- if (tls_type != GOT_NORMAL
- && (bfd_link_dll (info) || indx != 0)
- && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
- || h->root.type != bfd_link_hash_undefweak))
- {
- if (tls_type & GOT_TLS_IE)
- elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
+ indx = 0;
+ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
+ && (!bfd_link_pic (info)
+ || !SYMBOL_REFERENCES_LOCAL (info, h)))
+ indx = h->dynindx;
- if (tls_type & GOT_TLS_GD)
- elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
+ if (tls_type != GOT_NORMAL
+ && (bfd_link_dll (info) || indx != 0)
+ && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+ || h->root.type != bfd_link_hash_undefweak))
+ {
+ if (tls_type & GOT_TLS_IE)
+ elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
- if (tls_type & GOT_TLS_GDESC)
- {
- elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
- /* GDESC needs a trampoline to jump to. */
- htab->tls_trampoline = -1;
- }
+ if (tls_type & GOT_TLS_GD)
+ elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
- /* Only GD needs it. GDESC just emits one relocation per
- 2 entries. */
- if ((tls_type & GOT_TLS_GD) && indx != 0)
- elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
- }
- else if (((indx != -1) || htab->fdpic_p)
- && !SYMBOL_REFERENCES_LOCAL (info, h))
+ if (tls_type & GOT_TLS_GDESC)
{
- if (htab->root.dynamic_sections_created)
- /* Reserve room for the GOT entry's R_ARM_GLOB_DAT relocation. */
- elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
+ elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
+ /* GDESC needs a trampoline to jump to. */
+ htab->tls_trampoline = -1;
}
- else if (h->type == STT_GNU_IFUNC
- && eh->plt.noncall_refcount == 0)
- /* No non-call references resolve the STT_GNU_IFUNC's PLT entry;
- they all resolve dynamically instead. Reserve room for the
- GOT entry's R_ARM_IRELATIVE relocation. */
- elf32_arm_allocate_irelocs (info, htab->root.srelgot, 1);
- else if (bfd_link_pic (info)
- && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
- /* Reserve room for the GOT entry's R_ARM_RELATIVE relocation. */
+
+ /* Only GD needs it. GDESC just emits one relocation per
+ 2 entries. */
+ if ((tls_type & GOT_TLS_GD) && indx != 0)
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
- else if (htab->fdpic_p && tls_type == GOT_NORMAL)
- /* Reserve room for rofixup for FDPIC executable. */
- /* TLS relocs do not need space since they are completely
- resolved. */
- htab->srofixup->size += 4;
}
+ else if (((indx != -1) || htab->fdpic_p)
+ && !SYMBOL_REFERENCES_LOCAL (info, h))
+ {
+ if (htab->root.dynamic_sections_created)
+ /* Reserve room for the GOT entry's R_ARM_GLOB_DAT relocation. */
+ elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
+ }
+ else if (h->type == STT_GNU_IFUNC
+ && eh->plt.noncall_refcount == 0)
+ /* No non-call references resolve the STT_GNU_IFUNC's PLT entry;
+ they all resolve dynamically instead. Reserve room for the
+ GOT entry's R_ARM_IRELATIVE relocation. */
+ elf32_arm_allocate_irelocs (info, htab->root.srelgot, 1);
+ else if (bfd_link_pic (info)
+ && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
+ /* Reserve room for the GOT entry's R_ARM_RELATIVE relocation. */
+ elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
+ else if (htab->fdpic_p && tls_type == GOT_NORMAL)
+ /* Reserve room for rofixup for FDPIC executable. */
+ /* TLS relocs do not need space since they are completely
+ resolved. */
+ htab->srofixup->size += 4;
}
else
h->got.offset = (bfd_vma) -1;
if (h->dynindx != -1)
abort();
- /* We only allocate one function descriptor with its associated relocation. */
+ /* We only allocate one function descriptor with its associated
+ relocation. */
if (eh->fdpic_cnts.funcdesc_offset == -1)
{
asection *s = htab->root.sgot;
if (h->dynindx == -1)
{
- /* We only allocate one function descriptor with its associated relocation. q */
+ /* We only allocate one function descriptor with its
+ associated relocation. */
if (eh->fdpic_cnts.funcdesc_offset == -1)
{
eh->fdpic_cnts.funcdesc_offset = s->size;
s->size += 8;
- /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */
+ /* We will add an R_ARM_FUNCDESC_VALUE relocation or two
+ rofixups. */
if (bfd_link_pic(info))
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
else
if (h->dynindx == -1)
{
- /* We only allocate one function descriptor with its associated relocation. */
+ /* We only allocate one function descriptor with its
+ associated relocation. */
if (eh->fdpic_cnts.funcdesc_offset == -1)
{
asection *s = htab->root.sgot;
eh->fdpic_cnts.funcdesc_offset = s->size;
s->size += 8;
- /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */
+ /* We will add an R_ARM_FUNCDESC_VALUE relocation or two
+ rofixups. */
if (bfd_link_pic(info))
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
else
space for pc-relative relocs that have become local due to symbol
visibility changes. */
- if (bfd_link_pic (info) || htab->root.is_relocatable_executable || htab->fdpic_p)
+ if (bfd_link_pic (info)
+ || htab->root.is_relocatable_executable
+ || htab->fdpic_p)
{
/* Relocs that use pc_count are PC-relative forms, which will appear
on something like ".long foo - ." or "movw REG, foo - .". We want
&& eh->plt.noncall_refcount == 0
&& SYMBOL_REFERENCES_LOCAL (info, h))
elf32_arm_allocate_irelocs (info, sreloc, p->count);
- else if (h->dynindx != -1 && (!bfd_link_pic(info) || !info->symbolic || !h->def_regular))
+ else if (h->dynindx != -1
+ && (!bfd_link_pic(info) || !info->symbolic || !h->def_regular))
elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
else if (htab->fdpic_p && !bfd_link_pic(info))
htab->srofixup->size += 4 * p->count;
splt = htab->root.splt;
BFD_ASSERT (splt != NULL && sdyn != NULL);
- BFD_ASSERT (htab->root.target_os == is_symbian || sgot != NULL);
+ BFD_ASSERT (sgot != NULL);
dyncon = (Elf32_External_Dyn *) sdyn->contents;
dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
switch (dyn.d_tag)
{
- unsigned int type;
-
default:
if (htab->root.target_os == is_vxworks
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
break;
case DT_HASH:
- name = ".hash";
- goto get_vma_if_bpabi;
case DT_STRTAB:
- name = ".dynstr";
- goto get_vma_if_bpabi;
case DT_SYMTAB:
- name = ".dynsym";
- goto get_vma_if_bpabi;
case DT_VERSYM:
- name = ".gnu.version";
- goto get_vma_if_bpabi;
case DT_VERDEF:
- name = ".gnu.version_d";
- goto get_vma_if_bpabi;
case DT_VERNEED:
- name = ".gnu.version_r";
- goto get_vma_if_bpabi;
+ break;
case DT_PLTGOT:
- name = (htab->root.target_os == is_symbian
- ? ".got" : ".got.plt");
+ name = ".got.plt";
goto get_vma;
case DT_JMPREL:
name = RELOC_SECTION (htab, ".plt");
bfd_set_error (bfd_error_invalid_operation);
return FALSE;
}
- if (htab->root.target_os != is_symbian)
- dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
- else
- /* In the BPABI, tags in the PT_DYNAMIC section point
- at the file offset, not the memory address, for the
- convenience of the post linker. */
- dyn.d_un.d_ptr = s->output_section->filepos + s->output_offset;
+ dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break;
- get_vma_if_bpabi:
- if (htab->root.target_os == is_symbian)
- goto get_vma;
- break;
-
case DT_PLTRELSZ:
s = htab->root.srelplt;
BFD_ASSERT (s != NULL);
case DT_RELASZ:
case DT_REL:
case DT_RELA:
- /* In the BPABI, the DT_REL tag must point at the file
- offset, not the VMA, of the first relocation
- section. So, we use code similar to that in
- elflink.c, but do not check for SHF_ALLOC on the
- relocation section, since relocation sections are
- never allocated under the BPABI. PLT relocs are also
- included. */
- if (htab->root.target_os == is_symbian)
- {
- unsigned int i;
- type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
- ? SHT_REL : SHT_RELA);
- dyn.d_un.d_val = 0;
- for (i = 1; i < elf_numsections (output_bfd); i++)
- {
- Elf_Internal_Shdr *hdr
- = elf_elfsections (output_bfd)[i];
- if (hdr->sh_type == type)
- {
- if (dyn.d_tag == DT_RELSZ
- || dyn.d_tag == DT_RELASZ)
- dyn.d_un.d_val += hdr->sh_size;
- else if ((ufile_ptr) hdr->sh_offset
- <= dyn.d_un.d_val - 1)
- dyn.d_un.d_val = hdr->sh_offset;
- }
- }
- bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
- }
break;
case DT_TLSDESC_PLT:
(osi->info->output_bfd, osi->sec->output_section));
addr = root_plt->offset & -2;
- if (htab->root.target_os == is_symbian)
- {
- if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
- return FALSE;
- if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
- return FALSE;
- }
- else if (htab->root.target_os == is_vxworks)
+ if (htab->root.target_os == is_vxworks)
{
if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
return FALSE;
osi.sec_shndx = (_bfd_elf_section_from_bfd_section
(output_bfd, osi.sec->output_section));
- /* Output mapping symbols for the plt header. SymbianOS does not have a
- plt header. */
+ /* Output mapping symbols for the plt header. */
if (htab->root.target_os == is_vxworks)
{
/* VxWorks shared libraries have no PLT header. */
if (!elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, 16))
return FALSE;
}
- else if (htab->root.target_os != is_symbian && !htab->fdpic_p)
+ else if (!htab->fdpic_p)
{
if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
return FALSE;
return flags_compatible;
}
-
-
-/* Symbian OS Targets. */
-
-#undef TARGET_LITTLE_SYM
-#define TARGET_LITTLE_SYM arm_elf32_symbian_le_vec
-#undef TARGET_LITTLE_NAME
-#define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
-#undef TARGET_BIG_SYM
-#define TARGET_BIG_SYM arm_elf32_symbian_be_vec
-#undef TARGET_BIG_NAME
-#define TARGET_BIG_NAME "elf32-bigarm-symbian"
-
-/* Like elf32_arm_link_hash_table_create -- but overrides
- appropriately for Symbian OS. */
-
-static struct bfd_link_hash_table *
-elf32_arm_symbian_link_hash_table_create (bfd *abfd)
-{
- struct bfd_link_hash_table *ret;
-
- ret = elf32_arm_link_hash_table_create (abfd);
- if (ret)
- {
- struct elf32_arm_link_hash_table *htab
- = (struct elf32_arm_link_hash_table *)ret;
- /* There is no PLT header for Symbian OS. */
- htab->plt_header_size = 0;
- /* The PLT entries are each one instruction and one word. */
- htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
- /* Symbian uses armv5t or above, so use_blx is always true. */
- htab->use_blx = 1;
- htab->root.is_relocatable_executable = 1;
- }
- return ret;
-}
-
-static const struct bfd_elf_special_section
-elf32_arm_symbian_special_sections[] =
-{
- /* In a BPABI executable, the dynamic linking sections do not go in
- the loadable read-only segment. The post-linker may wish to
- refer to these sections, but they are not part of the final
- program image. */
- { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, 0 },
- { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, 0 },
- { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, 0 },
- { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, 0 },
- { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, 0 },
- /* These sections do not need to be writable as the SymbianOS
- postlinker will arrange things so that no dynamic relocation is
- required. */
- { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC },
- { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC },
- { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
- { NULL, 0, 0, 0, 0 }
-};
-
-static void
-elf32_arm_symbian_begin_write_processing (bfd *abfd,
- struct bfd_link_info *link_info)
-{
- /* BPABI objects are never loaded directly by an OS kernel; they are
- processed by a postlinker first, into an OS-specific format. If
- the D_PAGED bit is set on the file, BFD will align segments on
- page boundaries, so that an OS can directly map the file. With
- BPABI objects, that just results in wasted space. In addition,
- because we clear the D_PAGED bit, map_sections_to_segments will
- recognize that the program headers should not be mapped into any
- loadable segment. */
- abfd->flags &= ~D_PAGED;
- elf32_arm_begin_write_processing (abfd, link_info);
-}
-
-static bfd_boolean
-elf32_arm_symbian_modify_segment_map (bfd *abfd,
- struct bfd_link_info *info)
-{
- struct elf_segment_map *m;
- asection *dynsec;
-
- /* BPABI shared libraries and executables should have a PT_DYNAMIC
- segment. However, because the .dynamic section is not marked
- with SEC_LOAD, the generic ELF code will not create such a
- segment. */
- dynsec = bfd_get_section_by_name (abfd, ".dynamic");
- if (dynsec)
- {
- for (m = elf_seg_map (abfd); m != NULL; m = m->next)
- if (m->p_type == PT_DYNAMIC)
- break;
-
- if (m == NULL)
- {
- m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
- m->next = elf_seg_map (abfd);
- elf_seg_map (abfd) = m;
- }
- }
-
- /* Also call the generic arm routine. */
- return elf32_arm_modify_segment_map (abfd, info);
-}
-
-/* Return address for Ith PLT stub in section PLT, for relocation REL
- or (bfd_vma) -1 if it should not be included. */
-
-static bfd_vma
-elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
- const arelent *rel ATTRIBUTE_UNUSED)
-{
- return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
-}
-
-#undef elf32_bed
-#define elf32_bed elf32_arm_symbian_bed
-
-/* The dynamic sections are not allocated on SymbianOS; the postlinker
- will process them and then discard them. */
-#undef ELF_DYNAMIC_SEC_FLAGS
-#define ELF_DYNAMIC_SEC_FLAGS \
- (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
-
-#undef elf_backend_emit_relocs
-
-#undef bfd_elf32_bfd_link_hash_table_create
-#define bfd_elf32_bfd_link_hash_table_create elf32_arm_symbian_link_hash_table_create
-#undef elf_backend_special_sections
-#define elf_backend_special_sections elf32_arm_symbian_special_sections
-#undef elf_backend_begin_write_processing
-#define elf_backend_begin_write_processing elf32_arm_symbian_begin_write_processing
-#undef elf_backend_final_write_processing
-#define elf_backend_final_write_processing elf32_arm_final_write_processing
-
-#undef elf_backend_modify_segment_map
-#define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
-
-/* There is no .got section for BPABI objects, and hence no header. */
-#undef elf_backend_got_header_size
-#define elf_backend_got_header_size 0
-
-/* Similarly, there is no .got.plt section. */
-#undef elf_backend_want_got_plt
-#define elf_backend_want_got_plt 0
-
-#undef elf_backend_plt_sym_val
-#define elf_backend_plt_sym_val elf32_arm_symbian_plt_sym_val
-
-#undef elf_backend_may_use_rel_p
-#define elf_backend_may_use_rel_p 1
-#undef elf_backend_may_use_rela_p
-#define elf_backend_may_use_rela_p 0
-#undef elf_backend_default_use_rela_p
-#define elf_backend_default_use_rela_p 0
-#undef elf_backend_want_plt_sym
-#define elf_backend_want_plt_sym 0
-#undef elf_backend_dtrel_excludes_plt
-#define elf_backend_dtrel_excludes_plt 0
-#undef ELF_MAXPAGESIZE
-#define ELF_MAXPAGESIZE 0x8000
-#undef ELF_TARGET_OS
-#define ELF_TARGET_OS is_symbian
-
-#include "elf32-target.h"
+++ /dev/null
-# This variant of elf.sc is used for ARM BPABI platforms, like Symbian
-# OS, where a separate postlinker will operated on the generated
-# executable or shared object. See elf.sc for configuration variables
-# that apply; only BPABI-specific variables will be noted here.
-#
-# Copyright (C) 2014-2021 Free Software Foundation, Inc.
-#
-# Copying and distribution of this file, with or without modification,
-# are permitted in any medium without royalty provided the copyright
-# notice and this notice are preserved.
-
-test -z "$ENTRY" && ENTRY=_start
-test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
-test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
-if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
-test -z "${ELFSIZE}" && ELFSIZE=32
-test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
-test "$LD_FLAG" = "N" && DATA_ADDR=.
-test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
-test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
-test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT
-DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
-DATA_SEGMENT_RELRO_END=""
-DATA_SEGMENT_RELRO_GOTPLT_END=""
-DATA_SEGMENT_END=""
-if test -n "${COMMONPAGESIZE}"; then
- DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
- DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
- if test -n "${SEPARATE_GOTPLT}"; then
- DATA_SEGMENT_RELRO_GOTPLT_END=". = DATA_SEGMENT_RELRO_END (. + ${SEPARATE_GOTPLT});"
- else
- DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (.);"
- fi
-fi
-INTERP=".interp 0 : { *(.interp) }"
-PLT=".plt ${RELOCATING-0} : { *(.plt) }"
-RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
-DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }"
-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }"
-if test -z "${NO_SMALL_DATA}"; then
- SBSS=".sbss ${RELOCATING-0} :
- {
- ${RELOCATING+PROVIDE (__sbss_start = .);}
- ${RELOCATING+PROVIDE (___sbss_start = .);}
- ${RELOCATING+*(.dynsbss)}
- *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
- ${RELOCATING+*(.scommon)}
- ${RELOCATING+PROVIDE (__sbss_end = .);}
- ${RELOCATING+PROVIDE (___sbss_end = .);}
- }"
- SBSS2=".sbss2 ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }"
- SDATA="/* We want the small data sections together, so single-instruction offsets
- can access them all, and initialized data all before uninitialized, so
- we can shorten the on-disk segment size. */
- .sdata ${RELOCATING-0} :
- {
- ${RELOCATING+${SDATA_START_SYMBOLS}}
- *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
- }"
- SDATA2=".sdata2 ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) }"
- REL_SDATA=".rel.sdata ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
- .rela.sdata ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
- REL_SBSS=".rel.sbss ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
- .rela.sbss ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }"
- REL_SDATA2=".rel.sdata2 ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) }
- .rela.sdata2 ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }"
- REL_SBSS2=".rel.sbss2 ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
- .rela.sbss2 ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }"
-else
- NO_SMALL_DATA=" "
-fi
-test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" "
-INIT_ARRAY=".init_array ${RELOCATING-0} :
- {
- /* SymbianOS uses this symbol. */
- ${RELOCATING+PROVIDE (SHT\$\$INIT_ARRAY\$\$Base = .);}
- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__init_array_start = .);}}
- KEEP (*(SORT(.init_array.*)))
- KEEP (*(.init_array))
- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__init_array_end = .);}}
- /* SymbianOS uses this symbol. */
- ${RELOCATING+PROVIDE (SHT\$\$INIT_ARRAY\$\$Limit = .);}
- }"
-FINI_ARRAY=".fini_array ${RELOCATING-0} :
- {
- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__fini_array_start = .);}}
- KEEP (*(SORT(.fini_array.*)))
- KEEP (*(.fini_array))
- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__fini_array_end = .);}}
- }"
-CTOR=".ctors ${CONSTRUCTING-0} :
- {
- ${CONSTRUCTING+${CTOR_START}}
- /* gcc uses crtbegin.o to find the start of
- the constructors, so we make sure it is
- first. Because this is a wildcard, it
- doesn't matter if the user does not
- actually link against crtbegin.o; the
- linker won't look for a file to match a
- wildcard. The wildcard also means that it
- doesn't matter which directory crtbegin.o
- is in. */
-
- KEEP (*crtbegin.o(.ctors))
- KEEP (*crtbegin?.o(.ctors))
-
- /* We don't want to include the .ctor section from
- the crtend.o file until after the sorted ctors.
- The .ctor section from the crtend file contains the
- end of ctors marker and it must be last */
-
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
- KEEP (*(SORT(.ctors.*)))
- KEEP (*(.ctors))
- ${CONSTRUCTING+${CTOR_END}}
- }"
-DTOR=".dtors ${CONSTRUCTING-0} :
- {
- ${CONSTRUCTING+${DTOR_START}}
- KEEP (*crtbegin.o(.dtors))
- KEEP (*crtbegin?.o(.dtors))
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
- KEEP (*(SORT(.dtors.*)))
- KEEP (*(.dtors))
- ${CONSTRUCTING+${DTOR_END}}
- }"
-STACK=" .stack ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
- {
- ${RELOCATING+_stack = .;}
- *(.stack)
- }"
-
-TEXT_START_ADDR="SEGMENT_START(\"text\", ${TEXT_START_ADDR})"
-SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text\", ${SHLIB_TEXT_START_ADDR:-0})"
-DATA_ADDR="SEGMENT_START(\"data\", ${DATA_ADDR-${DATA_SEGMENT_ALIGN}})"
-SHLIB_DATA_ADDR="SEGMENT_START(\"data\", ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}})"
-
-# If this is for an embedded system, don't add SIZEOF_HEADERS.
-if [ -z "$EMBEDDED" ]; then
- test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
- SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR} + SIZEOF_HEADERS"
-else
- test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
- SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR}"
-fi
-
-cat <<EOF
-/* Copyright (C) 2014-2021 Free Software Foundation, Inc.
-
- Copying and distribution of this script, with or without modification,
- are permitted in any medium without royalty provided the copyright
- notice and this notice are preserved. */
-
-OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
- "${LITTLE_OUTPUT_FORMAT}")
-OUTPUT_ARCH(${OUTPUT_ARCH})
-EOF
-
-test -n "${RELOCATING}" && cat <<EOF
-ENTRY(${ENTRY})
-
-${LIB_SEARCH_DIRS}
-/* Do we need any of these for elf?
- __DYNAMIC = 0; ${STACKZERO+${STACKZERO}} ${SHLIB_PATH+${SHLIB_PATH}} */
-${EXECUTABLE_SYMBOLS}
-${INPUT_FILES}
-
-/* ARM's proprietary toolchain generate these symbols to match the start
- and end of particular sections of the image. SymbianOS uses these
- symbols. We provide them for compatibility with ARM's toolchains.
- These symbols should be bound locally; each shared object may define
- its own version of these symbols. */
-
-VERSION
-{
- /* Give these a dummy version to work around linker lameness.
- The name used shouldn't matter as these are all local symbols. */
- __GNU {
- local:
- Image\$\$ER_RO\$\$Base;
- Image\$\$ER_RO\$\$Limit;
- SHT\$\$INIT_ARRAY\$\$Base;
- SHT\$\$INIT_ARRAY\$\$Limit;
- .ARM.exidx\$\$Base;
- .ARM.exidx\$\$Limit;
- };
-}
-
-EOF
-
-cat <<EOF
-SECTIONS
-{
- /* Read-only sections, merged into text segment: */
- ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR});}}}
-
- ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+ . = ${TEXT_BASE_ADDRESS};}}}
- ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}}
- ${CREATE_PIE+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}}
-
- /* Define Image\$\$ER_RO\$\$Base. */
- ${RELOCATING+PROVIDE (Image\$\$ER_RO\$\$Base = .);}
-
- ${INITIAL_READONLY_SECTIONS}
-
-EOF
-cat <<EOF
- .init ${RELOCATING-0} :
- {
- ${RELOCATING+${INIT_START}}
- KEEP (*(SORT_NONE(.init)))
- ${RELOCATING+${INIT_END}}
- } =${NOP-0}
- .text ${RELOCATING-0} :
- {
- ${RELOCATING+${TEXT_START_SYMBOLS}}
- *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
- /* .gnu.warning sections are handled specially by elf.em. */
- *(.gnu.warning)
- ${RELOCATING+${OTHER_TEXT_SECTIONS}}
- } =${NOP-0}
- .fini ${RELOCATING-0} :
- {
- ${RELOCATING+${FINI_START}}
- KEEP (*(SORT_NONE(.fini)))
- ${RELOCATING+${FINI_END}}
- } =${NOP-0}
- /* The SymbianOS kernel requires that the PLT go at the end of the
- text section. */
- ${DATA_PLT-${BSS_PLT-${PLT}}}
- ${RELOCATING+PROVIDE (__etext = .);}
- ${RELOCATING+PROVIDE (_etext = .);}
- ${RELOCATING+PROVIDE (etext = .);}
-
- /* Define Image\$\$ER_RO\$\$Limit. */
- ${RELOCATING+PROVIDE (Image\$\$ER_RO\$\$Limit = .);}
-
- ${WRITABLE_RODATA-${RODATA}}
- .rodata1 ${RELOCATING-0} : { *(.rodata1) }
- ${CREATE_SHLIB-${SDATA2}}
- ${CREATE_SHLIB-${SBSS2}}
-
- /* On SymbianOS, put .init_array and friends in the read-only
- segment; there is no runtime relocation applied to these
- arrays. */
-
- .preinit_array ${RELOCATING-0} :
- {
- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__preinit_array_start = .);}}
- KEEP (*(.preinit_array))
- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__preinit_array_end = .);}}
- }
- ${RELOCATING+${INIT_ARRAY}}
- ${RELOCATING+${FINI_ARRAY}}
-
- ${OTHER_READONLY_SECTIONS}
- .eh_frame_hdr ${RELOCATING-0} : { *(.eh_frame_hdr) }
- .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
- .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.gcc_except_table${RELOCATING+ .gcc_except_table.*})) }
-
- /* Adjust the address for the data segment. We want to adjust up to
- the same address within the page on the next page up. */
- ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR};}}}
- ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR};}}
- ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR};}}
-
- /* Exception handling */
- .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
- .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.gcc_except_table${RELOCATING+ .gcc_except_table.*})) }
-
- /* Thread Local Storage sections */
- .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
- .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
-
- ${RELOCATING+${CTOR}}
- ${RELOCATING+${DTOR}}
- .jcr ${RELOCATING-0} : { KEEP (*(.jcr)) }
-
- ${RELOCATING+${DATARELRO}}
- ${OTHER_RELRO_SECTIONS}
- ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
-
- ${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}
-
- .data ${RELOCATING-0} :
- {
- ${RELOCATING+${DATA_START_SYMBOLS}}
- *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
- ${CONSTRUCTING+SORT(CONSTRUCTORS)}
- }
- .data1 ${RELOCATING-0} : { *(.data1) }
- ${WRITABLE_RODATA+${RODATA}}
- ${OTHER_READWRITE_SECTIONS}
- ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
- ${CREATE_SHLIB+${SDATA2}}
- ${CREATE_SHLIB+${SBSS2}}
- ${SDATA}
- ${OTHER_SDATA_SECTIONS}
- ${RELOCATING+_edata = .;}
- ${RELOCATING+PROVIDE (edata = .);}
- ${RELOCATING+. = DEFINED(__bss_segment_start) ? __bss_segment_start : .;}
- ${RELOCATING+__bss_start = .;}
- ${RELOCATING+${OTHER_BSS_SYMBOLS}}
- ${SBSS}
- ${BSS_PLT+${PLT}}
- .bss ${RELOCATING-0} :
- {
- ${RELOCATING+*(.dynbss)}
- *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
- ${RELOCATING+*(COMMON)
- /* Align here to ensure that the .bss section occupies space up to
- _end. Align after .bss to ensure correct alignment even if the
- .bss section disappears because there are no input sections. */
- . = ALIGN(${ALIGNMENT});}
- }
- ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
- ${RELOCATING+. = ALIGN(${ALIGNMENT});}
- ${RELOCATING+${OTHER_END_SYMBOLS}}
- ${RELOCATING+_end = .;}
- ${RELOCATING+PROVIDE (end = .);}
- ${RELOCATING+${DATA_SEGMENT_END}}
- ${STACK_ADDR+${STACK}}
-
- /* These sections are not mapped under the BPABI. */
- .dynamic 0 : { *(.dynamic) }
- .hash 0 : { *(.hash) }
- .dynsym 0 : { *(.dynsym) }
- .dynstr 0 : { *(.dynstr) }
- .gnu.version 0 : { *(.gnu.version) }
- .gnu.version_d 0: { *(.gnu.version_d) }
- .gnu.version_r 0: { *(.gnu.version_r) }
- ${CREATE_SHLIB-${INTERP}}
-
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-EOF
-
-. $srcdir/scripttempl/DWARF.sc
-
-cat <<EOF
- ${OTHER_SECTIONS}
- ${RELOCATING+${OTHER_SYMBOLS}}
- ${RELOCATING+${DISCARDED}}
-EOF
-
-# These relocations sections are part of the read-only segment in SVR4
-# executables, but are not mapped in BPABI executables.
-if [ "x$COMBRELOC" = x ]; then
- COMBRELOCCAT=cat
-else
- COMBRELOCCAT="cat > $COMBRELOC"
-fi
-eval $COMBRELOCCAT <<EOF
- .rel.init 0 : { *(.rel.init) }
- .rela.init 0 : { *(.rela.init) }
- .rel.text 0 : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
- .rela.text 0 : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
- .rel.fini 0 : { *(.rel.fini) }
- .rela.fini 0 : { *(.rela.fini) }
- .rel.rodata 0 : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
- .rela.rodata 0 : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
- ${OTHER_READONLY_RELOC_SECTIONS}
- .rel.data.rel.ro 0 : { *(.rel.data.rel.ro${RELOCATING+ .rel.data.rel.ro.*}) }
- .rela.data.rel.ro 0 : { *(.rela.data.rel.ro${RELOCATING+ .rela.data.rel.ro.*}) }
- .rel.data 0 : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
- .rela.data 0 : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
- .rel.tdata 0 : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
- .rela.tdata 0 : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
- .rel.tbss 0 : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
- .rela.tbss 0 : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
- .rel.ctors 0 : { *(.rel.ctors) }
- .rela.ctors 0 : { *(.rela.ctors) }
- .rel.dtors 0 : { *(.rel.dtors) }
- .rela.dtors 0 : { *(.rela.dtors) }
- ${REL_SDATA}
- ${REL_SBSS}
- ${REL_SDATA2}
- ${REL_SBSS2}
- .rel.bss 0 : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
- .rela.bss 0 : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
- .rel.init_array 0 : { *(.rel.init_array) }
- .rela.init_array 0 : { *(.rela.init_array) }
- .rel.fini_array 0 : { *(.rel.fini_array) }
- .rela.fini_array 0 : { *(.rela.fini_array) }
-EOF
-if [ -n "$COMBRELOC" ]; then
-cat <<EOF
- .rel.dyn 0 :
- {
-EOF
-sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/ \1/' $COMBRELOC
-cat <<EOF
- }
- .rela.dyn 0 :
- {
-EOF
-sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/ \1/' $COMBRELOC
-cat <<EOF
- }
-EOF
-fi
-cat <<EOF
- .rel.plt 0 : { *(.rel.plt) }
- .rela.plt 0 : { *(.rela.plt) }
- ${OTHER_PLT_RELOC_SECTIONS}
- .rel.other 0 : { *(.rel.*) }
- .rela.other 0 : { *(.rela.*) }
- .reli.other 0 : { *(.reli.*) }
-}
-EOF