From 5ae0bfb60a576344d7f701605346282c1144499e Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 28 Feb 2006 07:16:12 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 10 ++++++++++ bfd/elf32-i386.c | 17 ++++++++++------- ld/testsuite/ChangeLog | 5 +++++ ld/testsuite/ld-i386/emit-relocs.d | 8 ++++++++ ld/testsuite/ld-i386/emit-relocs.s | 1 + ld/testsuite/ld-i386/i386.exp | 2 ++ 6 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 ld/testsuite/ld-i386/emit-relocs.d create mode 100644 ld/testsuite/ld-i386/emit-relocs.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cba16409cb6..b95b908f92f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2006-02-28 Richard Sandiford + + * 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 * 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 3dd28e44637..794215cfb30 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 882fc65cebb..7e533d68ebb 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-02-28 Richard Sandiford + + * ld-i386/emit-relocs.s, ld-i386/emit-relocs.d: New test. + * ld-i386/i386.exp: Run it. + 2006-02-23 H.J. Lu * 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 00000000000..0c16b94d2e3 --- /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 00000000000..e609a2e5750 --- /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 4a170cdd10e..f0c0d5249af 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"} } -- 2.30.2