aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2008-08-06 19:49:06 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2008-08-06 19:49:06 +0000
commit4e41d0d7c3dcff6898ecfe038357e68c47144c70 (patch)
treea7ffa667529dc7587aed5d3f620f6cd5a1b001a7
parent738e53487d7edb6b7428b889dcb0721d3d9e2c43 (diff)
downloadbinutils-4e41d0d7c3dcff6898ecfe038357e68c47144c70.zip
binutils-4e41d0d7c3dcff6898ecfe038357e68c47144c70.tar.gz
binutils-4e41d0d7c3dcff6898ecfe038357e68c47144c70.tar.bz2
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.
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elfxx-mips.c73
-rw-r--r--ld/testsuite/ChangeLog18
-rw-r--r--ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d2
-rw-r--r--ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d2
-rw-r--r--ld/testsuite/ld-mips-elf/tls-hidden3.ld5
-rw-r--r--ld/testsuite/ld-mips-elf/tls-multi-got-1.got34
-rw-r--r--ld/testsuite/ld-mips-elf/tls-multi-got-1.r4
-rw-r--r--ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d4
-rw-r--r--ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d4
-rw-r--r--ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d4
-rw-r--r--ld/testsuite/ld-mips-elf/tlsdyn-o32.d4
12 files changed, 81 insertions, 85 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ead15cd..3741cfc 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,17 @@
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.
* libbfd.h, bfd-in2.h: Regenerate.
* elf32-mips.c (elf_mips16_howto_table_rel): Fill in reserved
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 00f33bd..c71e397 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -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;
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 60e3601..2b50e53 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,23 @@
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.
diff --git a/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d b/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
index 8753ba4..c9288c1 100644
--- a/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
+++ b/ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
@@ -21,5 +21,3 @@ Disassembly of section \.text:
.* bal .* <__start>
.* nop
\.\.\.
-Disassembly of section \.MIPS\.stubs:
- \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d b/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
index 47936d2..e26d5f1 100644
--- a/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
+++ b/ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
@@ -21,5 +21,3 @@ Disassembly of section \.text:
.* bal .* <__start>
.* nop
\.\.\.
-Disassembly of section \.MIPS\.stubs:
- \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/tls-hidden3.ld b/ld/testsuite/ld-mips-elf/tls-hidden3.ld
index b3d0584..261edce 100644
--- a/ld/testsuite/ld-mips-elf/tls-hidden3.ld
+++ b/ld/testsuite/ld-mips-elf/tls-hidden3.ld
@@ -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);
diff --git a/ld/testsuite/ld-mips-elf/tls-multi-got-1.got b/ld/testsuite/ld-mips-elf/tls-multi-got-1.got
index b8cacfa..b62d413 100644
--- a/ld/testsuite/ld-mips-elf/tls-multi-got-1.got
+++ b/ld/testsuite/ld-mips-elf/tls-multi-got-1.got
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/tls-multi-got-1.r b/ld/testsuite/ld-mips-elf/tls-multi-got-1.r
index 5ef19f6..a51abf1 100644
--- a/ld/testsuite/ld-mips-elf/tls-multi-got-1.r
+++ b/ld/testsuite/ld-mips-elf/tls-multi-got-1.r
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d
index 2ff4260..bf803c88 100644
--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d
+++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d
@@ -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>:
- ...
diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d
index 2ff4260..bf803c88 100644
--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d
+++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d
@@ -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>:
- ...
diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d
index 994585a..4a3a0e1 100644
--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d
+++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d
@@ -98,7 +98,3 @@ Disassembly of section .text:
.*: 03e00008 jr ra
.*: 00000000 nop
...
-Disassembly of section .MIPS.stubs:
-
-.* <.MIPS.stubs>:
- ...
diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32.d
index 2c55921..32c3e7d 100644
--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32.d
+++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32.d
@@ -52,7 +52,3 @@ Disassembly of section .text:
.*: 03e00008 jr ra
.*: 00000000 nop
...
-Disassembly of section .MIPS.stubs:
-
-.* <.MIPS.stubs>:
- ...