* 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>
* 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 *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). */
@ -6328,17 +6329,14 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
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
@ -7548,7 +7546,6 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
{
bfd *dynobj;
struct mips_elf_link_hash_entry *hmips;
asection *s;
struct mips_elf_link_hash_table *htab;
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)
{
/* 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. */
@ -7954,7 +7947,12 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
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);
@ -8095,12 +8093,6 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
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"))
@ -8114,7 +8106,8 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
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;
@ -8736,17 +8729,12 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
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));
@ -8781,8 +8769,9 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
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. */
@ -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
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);
}
@ -9604,15 +9594,13 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
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);
}
}
@ -10791,6 +10779,7 @@ _bfd_mips_elf_link_hash_table_create (bfd *abfd)
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;

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>
* ld-mips-elf/mips16-local-stubs-1.d: Remove stub_for_h3,

View File

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

View File

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

View File

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

View File

@ -4,33 +4,33 @@
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

View File

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

View File

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

View File

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

View File

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

View File

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