asection *srelplt2;
asection *sgotplt;
asection *splt;
+ asection *sstubs;
/* The size of the PLT header in bytes (VxWorks only). */
bfd_vma plt_header_size;
/* The size of a PLT entry in bytes (VxWorks only). */
return FALSE;
/* Create .stub section. */
- if (bfd_get_section_by_name (abfd,
- MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
- {
- s = bfd_make_section_with_flags (abfd,
- MIPS_ELF_STUB_SECTION_NAME (abfd),
- flags | SEC_CODE);
- if (s == NULL
- || ! bfd_set_section_alignment (abfd, s,
- MIPS_ELF_LOG_FILE_ALIGN (abfd)))
- return FALSE;
- }
+ s = bfd_make_section_with_flags (abfd,
+ MIPS_ELF_STUB_SECTION_NAME (abfd),
+ flags | SEC_CODE);
+ if (s == NULL
+ || ! bfd_set_section_alignment (abfd, s,
+ MIPS_ELF_LOG_FILE_ALIGN (abfd)))
+ return FALSE;
+ htab->sstubs = s;
if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
&& !info->shared
{
bfd *dynobj;
struct mips_elf_link_hash_entry *hmips;
- asection *s;
struct mips_elf_link_hash_table *htab;
htab = mips_elf_hash_table (info);
if (!h->def_regular)
{
/* We need .stub section. */
- s = bfd_get_section_by_name (dynobj,
- MIPS_ELF_STUB_SECTION_NAME (dynobj));
- BFD_ASSERT (s != NULL);
-
- h->root.u.def.section = s;
- h->root.u.def.value = s->size;
+ h->root.u.def.section = htab->sstubs;
+ h->root.u.def.value = htab->sstubs->size;
/* XXX Write this stub address somewhere. */
- h->plt.offset = s->size;
+ h->plt.offset = htab->sstubs->size;
/* Make room for this stub code. */
- s->size += htab->function_stub_size;
+ htab->sstubs->size += htab->function_stub_size;
/* The last half word of the stub will be filled with the index
of this symbol in .dynsym section. */
s->contents
= (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
}
- }
+ }
+
+ /* IRIX rld assumes that the function stub isn't at the end
+ of the .text section, so add a dummy entry to the end. */
+ if (htab->sstubs && htab->sstubs->size > 0)
+ htab->sstubs->size += htab->function_stub_size;
/* Allocate space for global sym dynamic relocs. */
elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info);
mips_elf_allocate_dynamic_relocations (dynobj, info,
needed_relocs);
}
- else if (strcmp (name, MIPS_ELF_STUB_SECTION_NAME (output_bfd)) == 0)
- {
- /* IRIX rld assumes that the function stub isn't at the end
- of .text section. So put a dummy. XXX */
- s->size += htab->function_stub_size;
- }
else if (! info->shared
&& ! mips_elf_hash_table (info)->use_rld_obj_head
&& CONST_STRNEQ (name, ".rld_map"))
s->size += mips_elf_hash_table (info)->compact_rel_size;
else if (! CONST_STRNEQ (name, ".init")
&& s != htab->sgotplt
- && s != htab->splt)
+ && s != htab->splt
+ && s != htab->sstubs)
{
/* It's not one of our sections, so don't allocate space. */
continue;
if (h->plt.offset != MINUS_ONE)
{
- asection *s;
bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
/* This symbol has a stub. Set it up. */
BFD_ASSERT (h->dynindx != -1);
- s = bfd_get_section_by_name (dynobj,
- MIPS_ELF_STUB_SECTION_NAME (dynobj));
- BFD_ASSERT (s != NULL);
-
BFD_ASSERT ((htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
|| (h->dynindx <= 0xffff));
bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
stub + idx);
- BFD_ASSERT (h->plt.offset <= s->size);
- memcpy (s->contents + h->plt.offset, stub, htab->function_stub_size);
+ BFD_ASSERT (h->plt.offset <= htab->sstubs->size);
+ memcpy (htab->sstubs->contents + h->plt.offset,
+ stub, htab->function_stub_size);
/* Mark the symbol as undefined. plt.offset != -1 occurs
only for the referenced symbol. */
/* The run-time linker uses the st_value field of the symbol
to reset the global offset table entry for this external
to its stub address when unlinking a shared object. */
- sym->st_value = (s->output_section->vma + s->output_offset
+ sym->st_value = (htab->sstubs->output_section->vma
+ + htab->sstubs->output_offset
+ h->plt.offset);
}
s->contents));
/* Clean up a dummy stub function entry in .text. */
- s = bfd_get_section_by_name (dynobj,
- MIPS_ELF_STUB_SECTION_NAME (dynobj));
- if (s != NULL)
+ if (htab->sstubs != NULL)
{
file_ptr dummy_offset;
- BFD_ASSERT (s->size >= htab->function_stub_size);
- dummy_offset = s->size - htab->function_stub_size;
- memset (s->contents + dummy_offset, 0,
+ BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
+ dummy_offset = htab->sstubs->size - htab->function_stub_size;
+ memset (htab->sstubs->contents + dummy_offset, 0,
htab->function_stub_size);
}
}
ret->srelplt2 = NULL;
ret->sgotplt = NULL;
ret->splt = NULL;
+ ret->sstubs = NULL;
ret->plt_header_size = 0;
ret->plt_entry_size = 0;
ret->function_stub_size = 0;
2008-08-06 Richard Sandiford <rdsandiford@googlemail.com>
+ * ld-mips-elf/tls-hidden3.ld: Remove the unused .MIPS.stubs section.
+ Keep the text start address the same.
+ * ld-mips-elf/tls-multi-got-1.got: We have removed a .MIPS.stubs
+ section that contained only a 16-byte dummy stub. Subtract 16
+ from addresses to account for the change.
+ * ld-mips-elf/tls-multi-got-1.r: Likewise. Adjust MIPS_UNREFEXTNO
+ to account the removed section symbol.
+ * ld-mips-elf/tlsdyn-o32-1.d: We have deleted a .MIPS.stubs
+ section that contained only a 16-byte dummy stub. Remove it
+ from the disassembly.
+ * ld-mips-elf/tlsdyn-o32-2.d: Likewise.
+ * ld-mips-elf/tlsdyn-o32-3.d: Likewise.
+ * ld-mips-elf/tlsdyn-o32.d: Likewise.
+ * ld-mips-elf/relax-jalr-n32-shared.d: Likewise.
+ * ld-mips-elf/relax-jalr-n64-shared.d: Likewise.
+
+2008-08-06 Richard Sandiford <rdsandiford@googlemail.com>
+
* ld-mips-elf/mips16-local-stubs-1.d: Remove stub_for_h3,
which was only referenced by the .pdr section, and was not
actually needed by code.
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
-0013f840 R_MIPS_TLS_DTPMOD32 \*ABS\*
-0014949c R_MIPS_TLS_DTPMOD32 \*ABS\*
-0013f84c R_MIPS_TLS_DTPMOD32 tlsvar_gd
-0013f850 R_MIPS_TLS_DTPREL32 tlsvar_gd
-001494a8 R_MIPS_TLS_DTPMOD32 tlsvar_gd
-001494ac R_MIPS_TLS_DTPREL32 tlsvar_gd
-0013f848 R_MIPS_TLS_TPREL32 tlsvar_ie
-001494a4 R_MIPS_TLS_TPREL32 tlsvar_ie
-00143e48 R_MIPS_REL32 sym_1_9526
+0013f830 R_MIPS_TLS_DTPMOD32 \*ABS\*
+0014948c R_MIPS_TLS_DTPMOD32 \*ABS\*
+0013f83c R_MIPS_TLS_DTPMOD32 tlsvar_gd
+0013f840 R_MIPS_TLS_DTPREL32 tlsvar_gd
+00149498 R_MIPS_TLS_DTPMOD32 tlsvar_gd
+0014949c R_MIPS_TLS_DTPREL32 tlsvar_gd
+0013f838 R_MIPS_TLS_TPREL32 tlsvar_ie
+00149494 R_MIPS_TLS_TPREL32 tlsvar_ie
+00143e38 R_MIPS_REL32 sym_1_9526
#...
-00139ac8 R_MIPS_REL32 sym_2_8654
+00139ab8 R_MIPS_REL32 sym_2_8654
Contents of section .got:
- 122370 00000000 80000000 000d7f98 000d65f4 .*
- 122380 000d1fa4 000d6010 000d5a48 000d19c0 .*
+ 122360 00000000 80000000 000d7f98 000d65f4 .*
+ 122370 000d1fa4 000d6010 000d5a48 000d19c0 .*
#...
- 135bf0 000cf204 000e0e48 00000000 80000000 .*
- 135c00 00000000 00000000 00000000 00000000 .*
+ 135be0 000cf204 000e0e48 00000000 80000000 .*
+ 135bf0 00000000 00000000 00000000 00000000 .*
#...
+ 13f820 00000000 00000000 00000000 00000000 .*
13f830 00000000 00000000 00000000 00000000 .*
- 13f840 00000000 00000000 00000000 00000000 .*
- 13f850 00000000 00000000 80000000 00000000 .*
+ 13f840 00000000 00000000 80000000 00000000 .*
#...
+ 149450 00000000 00000000 00000000 00000000 .*
149460 00000000 00000000 00000000 00000000 .*
149470 00000000 00000000 00000000 00000000 .*
149480 00000000 00000000 00000000 00000000 .*
149490 00000000 00000000 00000000 00000000 .*
- 1494a0 00000000 00000000 00000000 00000000 .*
#pass