* elfxx-mips.c (mips_elf_link_hash_table): Add an "sstubs" field.
	(_bfd_mips_elf_create_dynamic_sections): Use it to cache the stubs
	section.  Don't check whether the section already exists.
	(_bfd_mips_elf_adjust_dynamic_symbol): Use htab->sstubs.
	(_bfd_mips_elf_finish_dynamic_symbol): Likewise.
	(_bfd_mips_elf_finish_dynamic_sections): Likewise.
	(_bfd_mips_elf_size_dynamic_sections): Likewise.  Don't add the
	dummy stub to an empty section.
	(_bfd_mips_elf_link_hash_table_create): Initialize the "sstubs" field.

ld/testsuite/
	* 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.
This commit is contained in:
Richard Sandiford
2008-08-06 19:49:06 +00:00
parent 738e53487d
commit 4e41d0d7c3
12 changed files with 81 additions and 85 deletions

View File

@ -1,3 +1,15 @@
2008-08-06 Richard Sandiford <rdsandiford@googlemail.com>
* elfxx-mips.c (mips_elf_link_hash_table): Add an "sstubs" field.
(_bfd_mips_elf_create_dynamic_sections): Use it to cache the stubs
section. Don't check whether the section already exists.
(_bfd_mips_elf_adjust_dynamic_symbol): Use htab->sstubs.
(_bfd_mips_elf_finish_dynamic_symbol): Likewise.
(_bfd_mips_elf_finish_dynamic_sections): Likewise.
(_bfd_mips_elf_size_dynamic_sections): Likewise. Don't add the
dummy stub to an empty section.
(_bfd_mips_elf_link_hash_table_create): Initialize the "sstubs" field.
2008-08-06 Richard Sandiford <rdsandiford@googlemail.com> 2008-08-06 Richard Sandiford <rdsandiford@googlemail.com>
* reloc.c (BFD_RELOC_MIPS16_GOT16, BFD_RELOC_MIPS16_CALL16): Declare. * reloc.c (BFD_RELOC_MIPS16_GOT16, BFD_RELOC_MIPS16_CALL16): Declare.

View File

@ -363,6 +363,7 @@ struct mips_elf_link_hash_table
asection *srelplt2; asection *srelplt2;
asection *sgotplt; asection *sgotplt;
asection *splt; asection *splt;
asection *sstubs;
/* The size of the PLT header in bytes (VxWorks only). */ /* The size of the PLT header in bytes (VxWorks only). */
bfd_vma plt_header_size; bfd_vma plt_header_size;
/* The size of a PLT entry in bytes (VxWorks only). */ /* The size of a PLT entry in bytes (VxWorks only). */
@ -6328,9 +6329,6 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
return FALSE; return FALSE;
/* Create .stub section. */ /* Create .stub section. */
if (bfd_get_section_by_name (abfd,
MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
{
s = bfd_make_section_with_flags (abfd, s = bfd_make_section_with_flags (abfd,
MIPS_ELF_STUB_SECTION_NAME (abfd), MIPS_ELF_STUB_SECTION_NAME (abfd),
flags | SEC_CODE); flags | SEC_CODE);
@ -6338,7 +6336,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|| ! bfd_set_section_alignment (abfd, s, || ! bfd_set_section_alignment (abfd, s,
MIPS_ELF_LOG_FILE_ALIGN (abfd))) MIPS_ELF_LOG_FILE_ALIGN (abfd)))
return FALSE; return FALSE;
} htab->sstubs = s;
if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none) if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
&& !info->shared && !info->shared
@ -7548,7 +7546,6 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
{ {
bfd *dynobj; bfd *dynobj;
struct mips_elf_link_hash_entry *hmips; struct mips_elf_link_hash_entry *hmips;
asection *s;
struct mips_elf_link_hash_table *htab; struct mips_elf_link_hash_table *htab;
htab = mips_elf_hash_table (info); htab = mips_elf_hash_table (info);
@ -7578,18 +7575,14 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
if (!h->def_regular) if (!h->def_regular)
{ {
/* We need .stub section. */ /* We need .stub section. */
s = bfd_get_section_by_name (dynobj, h->root.u.def.section = htab->sstubs;
MIPS_ELF_STUB_SECTION_NAME (dynobj)); h->root.u.def.value = htab->sstubs->size;
BFD_ASSERT (s != NULL);
h->root.u.def.section = s;
h->root.u.def.value = s->size;
/* XXX Write this stub address somewhere. */ /* XXX Write this stub address somewhere. */
h->plt.offset = s->size; h->plt.offset = htab->sstubs->size;
/* Make room for this stub code. */ /* 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 /* The last half word of the stub will be filled with the index
of this symbol in .dynsym section. */ of this symbol in .dynsym section. */
@ -7956,6 +7949,11 @@ _bfd_mips_elf_size_dynamic_sections (bfd *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. */ /* Allocate space for global sym dynamic relocs. */
elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info); elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info);
@ -8095,12 +8093,6 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
mips_elf_allocate_dynamic_relocations (dynobj, info, mips_elf_allocate_dynamic_relocations (dynobj, info,
needed_relocs); 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 else if (! info->shared
&& ! mips_elf_hash_table (info)->use_rld_obj_head && ! mips_elf_hash_table (info)->use_rld_obj_head
&& CONST_STRNEQ (name, ".rld_map")) && CONST_STRNEQ (name, ".rld_map"))
@ -8114,7 +8106,8 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
s->size += mips_elf_hash_table (info)->compact_rel_size; s->size += mips_elf_hash_table (info)->compact_rel_size;
else if (! CONST_STRNEQ (name, ".init") else if (! CONST_STRNEQ (name, ".init")
&& s != htab->sgotplt && s != htab->sgotplt
&& s != htab->splt) && s != htab->splt
&& s != htab->sstubs)
{ {
/* It's not one of our sections, so don't allocate space. */ /* It's not one of our sections, so don't allocate space. */
continue; continue;
@ -8736,17 +8729,12 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
if (h->plt.offset != MINUS_ONE) if (h->plt.offset != MINUS_ONE)
{ {
asection *s;
bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE]; bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
/* This symbol has a stub. Set it up. */ /* This symbol has a stub. Set it up. */
BFD_ASSERT (h->dynindx != -1); 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) BFD_ASSERT ((htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
|| (h->dynindx <= 0xffff)); || (h->dynindx <= 0xffff));
@ -8781,8 +8769,9 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx), bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
stub + idx); stub + idx);
BFD_ASSERT (h->plt.offset <= s->size); BFD_ASSERT (h->plt.offset <= htab->sstubs->size);
memcpy (s->contents + h->plt.offset, stub, htab->function_stub_size); memcpy (htab->sstubs->contents + h->plt.offset,
stub, htab->function_stub_size);
/* Mark the symbol as undefined. plt.offset != -1 occurs /* Mark the symbol as undefined. plt.offset != -1 occurs
only for the referenced symbol. */ only for the referenced symbol. */
@ -8791,7 +8780,8 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
/* The run-time linker uses the st_value field of the symbol /* The run-time linker uses the st_value field of the symbol
to reset the global offset table entry for this external to reset the global offset table entry for this external
to its stub address when unlinking a shared object. */ 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); + h->plt.offset);
} }
@ -9604,15 +9594,13 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
s->contents)); s->contents));
/* Clean up a dummy stub function entry in .text. */ /* Clean up a dummy stub function entry in .text. */
s = bfd_get_section_by_name (dynobj, if (htab->sstubs != NULL)
MIPS_ELF_STUB_SECTION_NAME (dynobj));
if (s != NULL)
{ {
file_ptr dummy_offset; file_ptr dummy_offset;
BFD_ASSERT (s->size >= htab->function_stub_size); BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
dummy_offset = s->size - htab->function_stub_size; dummy_offset = htab->sstubs->size - htab->function_stub_size;
memset (s->contents + dummy_offset, 0, memset (htab->sstubs->contents + dummy_offset, 0,
htab->function_stub_size); htab->function_stub_size);
} }
} }
@ -10791,6 +10779,7 @@ _bfd_mips_elf_link_hash_table_create (bfd *abfd)
ret->srelplt2 = NULL; ret->srelplt2 = NULL;
ret->sgotplt = NULL; ret->sgotplt = NULL;
ret->splt = NULL; ret->splt = NULL;
ret->sstubs = NULL;
ret->plt_header_size = 0; ret->plt_header_size = 0;
ret->plt_entry_size = 0; ret->plt_entry_size = 0;
ret->function_stub_size = 0; ret->function_stub_size = 0;

View File

@ -1,3 +1,21 @@
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> 2008-08-06 Richard Sandiford <rdsandiford@googlemail.com>
* ld-mips-elf/mips16-local-stubs-1.d: Remove stub_for_h3, * ld-mips-elf/mips16-local-stubs-1.d: Remove stub_for_h3,

View File

@ -21,5 +21,3 @@ Disassembly of section \.text:
.* bal .* <__start> .* bal .* <__start>
.* nop .* nop
\.\.\. \.\.\.
Disassembly of section \.MIPS\.stubs:
\.\.\.

View File

@ -21,5 +21,3 @@ Disassembly of section \.text:
.* bal .* <__start> .* bal .* <__start>
.* nop .* nop
\.\.\. \.\.\.
Disassembly of section \.MIPS\.stubs:
\.\.\.

View File

@ -9,10 +9,7 @@ SECTIONS
. = ALIGN (0x400); . = ALIGN (0x400);
.rel.dyn : { *(.rel.dyn) } .rel.dyn : { *(.rel.dyn) }
. = ALIGN (0x400); . = ALIGN (0x400) + 0x400;
.MIPS.stubs : { *(.MIPS.stubs) }
. = ALIGN (0x400);
.text : { *(.text) } .text : { *(.text) }
. = ALIGN (0x10000); . = ALIGN (0x10000);

View File

@ -4,33 +4,33 @@
DYNAMIC RELOCATION RECORDS DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\* 00000000 R_MIPS_NONE \*ABS\*
0013f840 R_MIPS_TLS_DTPMOD32 \*ABS\* 0013f830 R_MIPS_TLS_DTPMOD32 \*ABS\*
0014949c R_MIPS_TLS_DTPMOD32 \*ABS\* 0014948c R_MIPS_TLS_DTPMOD32 \*ABS\*
0013f84c R_MIPS_TLS_DTPMOD32 tlsvar_gd 0013f83c R_MIPS_TLS_DTPMOD32 tlsvar_gd
0013f850 R_MIPS_TLS_DTPREL32 tlsvar_gd 0013f840 R_MIPS_TLS_DTPREL32 tlsvar_gd
001494a8 R_MIPS_TLS_DTPMOD32 tlsvar_gd 00149498 R_MIPS_TLS_DTPMOD32 tlsvar_gd
001494ac R_MIPS_TLS_DTPREL32 tlsvar_gd 0014949c R_MIPS_TLS_DTPREL32 tlsvar_gd
0013f848 R_MIPS_TLS_TPREL32 tlsvar_ie 0013f838 R_MIPS_TLS_TPREL32 tlsvar_ie
001494a4 R_MIPS_TLS_TPREL32 tlsvar_ie 00149494 R_MIPS_TLS_TPREL32 tlsvar_ie
00143e48 R_MIPS_REL32 sym_1_9526 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: Contents of section .got:
122370 00000000 80000000 000d7f98 000d65f4 .* 122360 00000000 80000000 000d7f98 000d65f4 .*
122380 000d1fa4 000d6010 000d5a48 000d19c0 .* 122370 000d1fa4 000d6010 000d5a48 000d19c0 .*
#... #...
135bf0 000cf204 000e0e48 00000000 80000000 .* 135be0 000cf204 000e0e48 00000000 80000000 .*
135c00 00000000 00000000 00000000 00000000 .* 135bf0 00000000 00000000 00000000 00000000 .*
#... #...
13f820 00000000 00000000 00000000 00000000 .*
13f830 00000000 00000000 00000000 00000000 .* 13f830 00000000 00000000 00000000 00000000 .*
13f840 00000000 00000000 00000000 00000000 .* 13f840 00000000 00000000 80000000 00000000 .*
13f850 00000000 00000000 80000000 00000000 .*
#... #...
149450 00000000 00000000 00000000 00000000 .*
149460 00000000 00000000 00000000 00000000 .* 149460 00000000 00000000 00000000 00000000 .*
149470 00000000 00000000 00000000 00000000 .* 149470 00000000 00000000 00000000 00000000 .*
149480 00000000 00000000 00000000 00000000 .* 149480 00000000 00000000 00000000 00000000 .*
149490 00000000 00000000 00000000 00000000 .* 149490 00000000 00000000 00000000 00000000 .*
1494a0 00000000 00000000 00000000 00000000 .*
#pass #pass

View File

@ -6,7 +6,7 @@ Dynamic section at offset .* contains 18 entries:
0x00000006 \(SYMTAB\).* 0x00000006 \(SYMTAB\).*
0x0000000a \(STRSZ\) 220091 \(bytes\) 0x0000000a \(STRSZ\) 220091 \(bytes\)
0x0000000b \(SYMENT\) 16 \(bytes\) 0x0000000b \(SYMENT\) 16 \(bytes\)
0x00000003 \(PLTGOT\) 0x122370 0x00000003 \(PLTGOT\) 0x122360
0x00000011 \(REL\) 0xa7978 0x00000011 \(REL\) 0xa7978
0x00000012 \(RELSZ\) 160072 \(bytes\) 0x00000012 \(RELSZ\) 160072 \(bytes\)
0x00000013 \(RELENT\) 8 \(bytes\) 0x00000013 \(RELENT\) 8 \(bytes\)
@ -15,7 +15,7 @@ Dynamic section at offset .* contains 18 entries:
0x70000006 \(MIPS_BASE_ADDRESS\) 0 0x70000006 \(MIPS_BASE_ADDRESS\) 0
0x7000000a \(MIPS_LOCAL_GOTNO\) 2 0x7000000a \(MIPS_LOCAL_GOTNO\) 2
0x70000011 \(MIPS_SYMTABNO\) 20013 0x70000011 \(MIPS_SYMTABNO\) 20013
0x70000012 \(MIPS_UNREFEXTNO\) 11 0x70000012 \(MIPS_UNREFEXTNO\) 10
0x70000013 \(MIPS_GOTSYM\) 0xd 0x70000013 \(MIPS_GOTSYM\) 0xd
0x0000001e \(FLAGS\) STATIC_TLS 0x0000001e \(FLAGS\) STATIC_TLS
0x00000000 \(NULL\) 0x0 0x00000000 \(NULL\) 0x0

View File

@ -98,7 +98,3 @@ Disassembly of section .text:
.*: 03e00008 jr ra .*: 03e00008 jr ra
.*: 27bd0010 addiu sp,sp,16 .*: 27bd0010 addiu sp,sp,16
.*: 00000000 nop .*: 00000000 nop
Disassembly of section .MIPS.stubs:
.* <.MIPS.stubs>:
...

View File

@ -98,7 +98,3 @@ Disassembly of section .text:
.*: 03e00008 jr ra .*: 03e00008 jr ra
.*: 27bd0010 addiu sp,sp,16 .*: 27bd0010 addiu sp,sp,16
.*: 00000000 nop .*: 00000000 nop
Disassembly of section .MIPS.stubs:
.* <.MIPS.stubs>:
...

View File

@ -98,7 +98,3 @@ Disassembly of section .text:
.*: 03e00008 jr ra .*: 03e00008 jr ra
.*: 00000000 nop .*: 00000000 nop
... ...
Disassembly of section .MIPS.stubs:
.* <.MIPS.stubs>:
...

View File

@ -52,7 +52,3 @@ Disassembly of section .text:
.*: 03e00008 jr ra .*: 03e00008 jr ra
.*: 00000000 nop .*: 00000000 nop
... ...
Disassembly of section .MIPS.stubs:
.* <.MIPS.stubs>:
...