diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2006-02-28 07:16:12 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2006-02-28 07:16:12 +0000 |
commit | 5ae0bfb60a576344d7f701605346282c1144499e (patch) | |
tree | 65e12d2ad3279a32dbaa7e1289beae61049b1fed | |
parent | cc10cae34af928d41c47ed1014abafde99165c28 (diff) | |
download | gdb-5ae0bfb60a576344d7f701605346282c1144499e.zip gdb-5ae0bfb60a576344d7f701605346282c1144499e.tar.gz gdb-5ae0bfb60a576344d7f701605346282c1144499e.tar.bz2 |
bfd/
* 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.
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 17 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/emit-relocs.d | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/emit-relocs.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/i386.exp | 2 |
6 files changed, 36 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cba1640..b95b908 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 3dd28e4..794215c 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -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); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 882fc65..7e533d6 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -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 index 0000000..0c16b94 --- /dev/null +++ b/ld/testsuite/ld-i386/emit-relocs.d @@ -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 index 0000000..e609a2e --- /dev/null +++ b/ld/testsuite/ld-i386/emit-relocs.s @@ -0,0 +1 @@ + call foo@plt diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 4a170cd..f0c0d52 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -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"} } |