From 4e41d0d7c3dcff6898ecfe038357e68c47144c70 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 6 Aug 2008 19:49:06 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 12 ++++ bfd/elfxx-mips.c | 73 ++++++++++-------------- ld/testsuite/ChangeLog | 18 ++++++ ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d | 2 - ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d | 2 - ld/testsuite/ld-mips-elf/tls-hidden3.ld | 5 +- ld/testsuite/ld-mips-elf/tls-multi-got-1.got | 34 +++++------ ld/testsuite/ld-mips-elf/tls-multi-got-1.r | 4 +- ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d | 4 -- ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d | 4 -- ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d | 4 -- ld/testsuite/ld-mips-elf/tlsdyn-o32.d | 4 -- 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 + * 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 + * 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 + * 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 + * 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..bf803c8 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..bf803c8 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>: - ... -- 2.7.4