bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Wed, 6 Aug 2008 19:49:06 +0000 (19:49 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Wed, 6 Aug 2008 19:49:06 +0000 (19:49 +0000)
* 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.

12 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
ld/testsuite/ChangeLog
ld/testsuite/ld-mips-elf/relax-jalr-n32-shared.d
ld/testsuite/ld-mips-elf/relax-jalr-n64-shared.d
ld/testsuite/ld-mips-elf/tls-hidden3.ld
ld/testsuite/ld-mips-elf/tls-multi-got-1.got
ld/testsuite/ld-mips-elf/tls-multi-got-1.r
ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d
ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d
ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d
ld/testsuite/ld-mips-elf/tlsdyn-o32.d

index ead15cdd1c9bd04abc0f665bc7129edd77247fc9..3741cfc8b93494e996c681061fddb0cacd35fa51 100644 (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.
index 00f33bd64ec6bce3ba5b464d02adde81184e8ea8..c71e3978c9089d428a66cc214098d6414490f2e3 100644 (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;
index 60e3601f0cf69c50f1770b21e8078c16ad6f2139..2b50e53b5f64dff6bea0257e139aa8536ec5048d 100644 (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,
index 8753ba456650a2554e075a423e32dd28b0c41346..c9288c1d1adc1594b1b3c6fa84bcd272f6115065 100644 (file)
@@ -21,5 +21,3 @@ Disassembly of section \.text:
 .*     bal     .* <__start>
 .*     nop
        \.\.\.
-Disassembly of section \.MIPS\.stubs:
-       \.\.\.
index 47936d295ffd1992e0d58aacbfdf0275fd12c2f2..e26d5f15466a700d631e4751611348cde3124de9 100644 (file)
@@ -21,5 +21,3 @@ Disassembly of section \.text:
 .*     bal     .* <__start>
 .*     nop
        \.\.\.
-Disassembly of section \.MIPS\.stubs:
-       \.\.\.
index b3d0584c8810aabf9e7d0090a58b40b30edfb5f8..261edceb3d93631f24292c875d8933b5beddcdd2 100644 (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);
index b8cacfaabf47035b8f490ab83fcfc6131457b9fd..b62d41356170f5ee16aa3a90ce072e0a5cc80cd1 100644 (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
index 5ef19f6c22281c9f4929561642819f37a6240dcc..a51abf10f414c4388fa8350bd6ce3de6ecc79ffc 100644 (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
index 2ff426011a69b8a6c17b652e88bcae7908675fbc..bf803c881b74d9c702e719e911a6f1f21f30e288 100644 (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>:
-       ...
index 2ff426011a69b8a6c17b652e88bcae7908675fbc..bf803c881b74d9c702e719e911a6f1f21f30e288 100644 (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>:
-       ...
index 994585af891abb3ef7ddef73b3dc8c8f715ea8c3..4a3a0e1b579ab31a0583ae9f4e02af3be54d6573 100644 (file)
@@ -98,7 +98,3 @@ Disassembly of section .text:
   .*:  03e00008        jr      ra
   .*:  00000000        nop
        ...
-Disassembly of section .MIPS.stubs:
-
-.* <.MIPS.stubs>:
-       ...
index 2c5592180ed2d27eae58af75c1bbb1f38b6fa32d..32c3e7df21b3fe8be9b3a55ce7501c1f8065a2b4 100644 (file)
@@ -52,7 +52,3 @@ Disassembly of section .text:
   .*:  03e00008        jr      ra
   .*:  00000000        nop
        ...
-Disassembly of section .MIPS.stubs:
-
-.* <.MIPS.stubs>:
-       ...