bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Tue, 28 Feb 2006 07:16:12 +0000 (07:16 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Tue, 28 Feb 2006 07:16:12 +0000 (07:16 +0000)
* elf32-i386.c (elf_i386_link_hash_table): Add next_tls_desc_index.
(elf_i386_link_hash_table_create): Initialize it.
(elf_i386_compute_jump_table_size): Use it instead of
srelplt->reloc_count.
(allocate_dynrelocs): Likewise.
(elf_i386_size_dynamic_sections): Likewise.
(elf_i386_relocate_section): Likewise.

ld/testsuite/
* ld-i386/emit-relocs.s, ld-i386/emit-relocs.d: New test.
* ld-i386/i386.exp: Run it.

bfd/ChangeLog
bfd/elf32-i386.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/emit-relocs.d [new file with mode: 0644]
ld/testsuite/ld-i386/emit-relocs.s [new file with mode: 0644]
ld/testsuite/ld-i386/i386.exp

index cba16409cb6108af7eab6d7407dc1e4cdc7d5c4b..b95b908f92fb21a336860a9c9152312f9dc6a569 100644 (file)
@@ -1,3 +1,13 @@
+2006-02-28  Richard Sandiford  <richard@codesourcery.com>
+
+       * elf32-i386.c (elf_i386_link_hash_table): Add next_tls_desc_index.
+       (elf_i386_link_hash_table_create): Initialize it.
+       (elf_i386_compute_jump_table_size): Use it instead of
+       srelplt->reloc_count.
+       (allocate_dynrelocs): Likewise.
+       (elf_i386_size_dynamic_sections): Likewise.
+       (elf_i386_relocate_section): Likewise.
+       
 2006-02-27  Jakub Jelinek  <jakub@redhat.com>
 
        * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Handle S flag.
index 3dd28e44637895e45ef851aae0ee3b3b17b96b44..794215cfb3007ad6781ac30f16eea685273e99a5 100644 (file)
@@ -653,6 +653,9 @@ struct elf_i386_link_hash_table
   /* Value used to fill the last word of the first plt entry.  */
   bfd_byte plt0_pad_byte;
 
+  /* The index of the next unused R_386_TLS_DESC slot in .rel.plt.  */
+  bfd_vma next_tls_desc_index;
+
   union {
     bfd_signed_vma refcount;
     bfd_vma offset;
@@ -672,7 +675,7 @@ struct elf_i386_link_hash_table
   ((struct elf_i386_link_hash_table *) ((p)->hash))
 
 #define elf_i386_compute_jump_table_size(htab) \
-  ((htab)->srelplt->reloc_count * 4)
+  ((htab)->next_tls_desc_index * 4)
 
 /* Create an entry in an i386 ELF linker hash table.  */
 
@@ -732,6 +735,7 @@ elf_i386_link_hash_table_create (bfd *abfd)
   ret->sdynbss = NULL;
   ret->srelbss = NULL;
   ret->tls_ldm_got.refcount = 0;
+  ret->next_tls_desc_index = 0;
   ret->sgotplt_jump_table_size = 0;
   ret->sym_sec.abfd = NULL;
   ret->is_vxworks = 0;
@@ -1639,7 +1643,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 
          /* We also need to make an entry in the .rel.plt section.  */
          htab->srelplt->size += sizeof (Elf32_External_Rel);
-         htab->srelplt->reloc_count++;
+         htab->next_tls_desc_index++;
 
          if (htab->is_vxworks && !info->shared)
            {
@@ -2021,7 +2025,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
      for them, it suffices to multiply the reloc count by the jump
      slot size.  */
   if (htab->srelplt)
-    htab->sgotplt_jump_table_size = htab->srelplt->reloc_count * 4;
+    htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
 
   /* We now have determined the sizes of the various dynamic sections.
      Allocate memory for them.  */
@@ -2054,8 +2058,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
          /* We use the reloc_count field as a counter if we need
             to copy relocs into the output file.  */
-         if (s != htab->srelplt)
-           s->reloc_count = 0;
+         s->reloc_count = 0;
        }
       else
        {
@@ -2997,8 +3000,8 @@ elf_i386_relocate_section (bfd *output_bfd,
                                     + htab->sgotplt_jump_table_size);
                  sreloc = htab->srelplt;
                  loc = sreloc->contents;
-                 loc += sreloc->reloc_count++
-                   * sizeof (Elf32_External_Rel);
+                 loc += (htab->next_tls_desc_index++
+                         * sizeof (Elf32_External_Rel));
                  BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
                              <= sreloc->contents + sreloc->size);
                  bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
index 882fc65cebbbb2fc4e125706466cc15f65897e1d..7e533d68ebb44e483bb1b7881623df82f724abd3 100644 (file)
@@ -1,3 +1,8 @@
+2006-02-28  Richard Sandiford  <richard@codesourcery.com>
+
+       * ld-i386/emit-relocs.s, ld-i386/emit-relocs.d: New test.
+       * ld-i386/i386.exp: Run it.
+
 2006-02-23  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-pie/weakundef-data.c: Fix the typo.
diff --git a/ld/testsuite/ld-i386/emit-relocs.d b/ld/testsuite/ld-i386/emit-relocs.d
new file mode 100644 (file)
index 0000000..0c16b94
--- /dev/null
@@ -0,0 +1,8 @@
+
+Relocation section '\.rel\.plt' at offset .* contains 1 entries:
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+.*  .*07 R_386_JUMP_SLOT   00000000   foo
+
+Relocation section '\.rel\.text' at offset .* contains 1 entries:
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+.*  .*04 R_386_PLT32       00000000   foo
diff --git a/ld/testsuite/ld-i386/emit-relocs.s b/ld/testsuite/ld-i386/emit-relocs.s
new file mode 100644 (file)
index 0000000..e609a2e
--- /dev/null
@@ -0,0 +1 @@
+       call    foo@plt
index 4a170cdd10e7452763c782e08f1fb6078bfa49db..f0c0d5249affce6eada369e2ae9b51d85fc79f3f 100644 (file)
@@ -75,6 +75,8 @@ set i386tests {
      {{objdump -drj.text tlsindntpoff.dd}} "tlsindntpoff"}
     {"Reloc section order" "-shared -melf_i386 -z nocombreloc" "--32"
      {reloc.s} {{objdump -hw reloc.d}} "reloc.so"}
+    {"Basic --emit-relocs support" "-shared -melf_i386 --emit-relocs" "--32"
+     {emit-relocs.s} {{readelf --relocs emit-relocs.d}} "emit-relocs.so"}
     {"-z combreloc relocation sections" "-shared -melf_i386 -z combreloc"
      "--32" {combreloc.s} {{readelf -r combreloc.d}} "combreloc.so"}
 }