bfd/
* 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:
parent
738e53487d
commit
4e41d0d7c3
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -21,5 +21,3 @@ Disassembly of section \.text:
|
||||
.* bal .* <__start>
|
||||
.* nop
|
||||
\.\.\.
|
||||
Disassembly of section \.MIPS\.stubs:
|
||||
\.\.\.
|
||||
|
@ -21,5 +21,3 @@ Disassembly of section \.text:
|
||||
.* bal .* <__start>
|
||||
.* nop
|
||||
\.\.\.
|
||||
Disassembly of section \.MIPS\.stubs:
|
||||
\.\.\.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>:
|
||||
...
|
||||
|
@ -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>:
|
||||
...
|
||||
|
@ -98,7 +98,3 @@ Disassembly of section .text:
|
||||
.*: 03e00008 jr ra
|
||||
.*: 00000000 nop
|
||||
...
|
||||
Disassembly of section .MIPS.stubs:
|
||||
|
||||
.* <.MIPS.stubs>:
|
||||
...
|
||||
|
@ -52,7 +52,3 @@ Disassembly of section .text:
|
||||
.*: 03e00008 jr ra
|
||||
.*: 00000000 nop
|
||||
...
|
||||
Disassembly of section .MIPS.stubs:
|
||||
|
||||
.* <.MIPS.stubs>:
|
||||
...
|
||||
|
Loading…
Reference in New Issue
Block a user