From 82e96e07e5c45073273535cfe3ca665091199033 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 14 Jan 2011 04:24:00 +0000 Subject: [PATCH] Fix x86-64 ILP32 shared library. bfd/ 2011-01-13 H.J. Lu * elf64-x86-64.c (elf_x86_64_link_hash_table): Remove swap_reloca_out. (elf_x86_64_link_hash_table_create): Don't set swap_reloca_out. (elf_x86_64_check_relocs): Align relocation section to 4 byte for 32bit. (elf_x86_64_gc_sweep_hook): Replace ELF64_ST_TYPE with ELF_ST_TYPE. (elf_x86_64_finish_dynamic_symbol): Updated. (elf_x86_64_finish_dynamic_sections): Don't use Elf64_External_Dyn, bfd_elf64_swap_dyn_in, nor bfd_elf64_swap_dyn_out. ld/testsuite/ 2011-01-13 H.J. Lu * ld-x86-64/ilp32-4.d: New. * ld-x86-64/x86-64.exp: Run ilp32-4. --- bfd/ChangeLog | 14 ++++++++++++ bfd/elf64-x86-64.c | 26 +++++++++++----------- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-x86-64/ilp32-4.d | 36 +++++++++++++++++++++++++++++++ ld/testsuite/ld-x86-64/x86-64.exp | 1 + 5 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 ld/testsuite/ld-x86-64/ilp32-4.d diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9a7433203bf..326b326d613 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2011-01-13 H.J. Lu + + * elf64-x86-64.c (elf_x86_64_link_hash_table): Remove + swap_reloca_out. + (elf_x86_64_link_hash_table_create): Don't set swap_reloca_out. + (elf_x86_64_check_relocs): Align relocation section to 4 byte + for 32bit. + (elf_x86_64_gc_sweep_hook): Replace ELF64_ST_TYPE with + ELF_ST_TYPE. + (elf_x86_64_finish_dynamic_symbol): Updated. + (elf_x86_64_finish_dynamic_sections): Don't use + Elf64_External_Dyn, bfd_elf64_swap_dyn_in, nor + bfd_elf64_swap_dyn_out. + 2011-01-14 J. Park PR ld/12339 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index ceb1a0a19a3..6066330f4c0 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -495,7 +495,6 @@ struct elf_x86_64_link_hash_table bfd_vma (*r_info) (bfd_vma, bfd_vma); bfd_vma (*r_sym) (bfd_vma); - void (*swap_reloca_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *); const char *dynamic_interpreter; int dynamic_interpreter_size; @@ -659,7 +658,6 @@ elf_x86_64_link_hash_table_create (bfd *abfd) { ret->r_info = elf64_r_info; ret->r_sym = elf64_r_sym; - ret->swap_reloca_out = bfd_elf64_swap_reloca_out; ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER; ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER; } @@ -667,7 +665,6 @@ elf_x86_64_link_hash_table_create (bfd *abfd) { ret->r_info = elf32_r_info; ret->r_sym = elf32_r_sym; - ret->swap_reloca_out = bfd_elf32_swap_reloca_out; ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER; ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER; } @@ -1545,7 +1542,8 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, htab->elf.dynobj = abfd; sreloc = _bfd_elf_make_dynamic_reloc_section - (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE); + (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2, + abfd, /*rela?*/ TRUE); if (sreloc == NULL) return FALSE; @@ -1699,7 +1697,7 @@ elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, /* Check relocation against local STT_GNU_IFUNC symbol. */ if (isym != NULL - && ELF64_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) + && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) { h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE); if (h == NULL) @@ -3945,7 +3943,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd, bed = get_elf_backend_data (output_bfd); loc = relplt->contents + plt_index * bed->s->sizeof_rela; - htab->swap_reloca_out (output_bfd, &rela, loc); + bed->s->swap_reloca_out (output_bfd, &rela, loc); if (!h->def_regular) { @@ -4116,19 +4114,23 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd, if (htab->elf.dynamic_sections_created) { - Elf64_External_Dyn *dyncon, *dynconend; + bfd_byte *dyncon, *dynconend; + const struct elf_backend_data *bed; + bfd_size_type sizeof_dyn; if (sdyn == NULL || htab->elf.sgot == NULL) abort (); - dyncon = (Elf64_External_Dyn *) sdyn->contents; - dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); - for (; dyncon < dynconend; dyncon++) + bed = get_elf_backend_data (dynobj); + sizeof_dyn = bed->s->sizeof_dyn; + dyncon = sdyn->contents; + dynconend = sdyn->contents + sdyn->size; + for (; dyncon < dynconend; dyncon += sizeof_dyn) { Elf_Internal_Dyn dyn; asection *s; - bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); + (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn); switch (dyn.d_tag) { @@ -4177,7 +4179,7 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd, break; } - bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); + (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon); } /* Fill in the special first entry in the procedure linkage table. */ diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 94c35e38661..02c0c343276 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-01-13 H.J. Lu + + * ld-x86-64/ilp32-4.d: New. + + * ld-x86-64/x86-64.exp: Run ilp32-4. + 2011-01-13 H.J. Lu PR ld/12356 diff --git a/ld/testsuite/ld-x86-64/ilp32-4.d b/ld/testsuite/ld-x86-64/ilp32-4.d new file mode 100644 index 00000000000..24fe4c53ba3 --- /dev/null +++ b/ld/testsuite/ld-x86-64/ilp32-4.d @@ -0,0 +1,36 @@ +#source: start.s +#as: --n32 +#ld: -m elf32_x86_64 -shared +#readelf: -d -S --wide + +There are 10 section headers, starting at offset 0x22c: + +Section Headers: + \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al + \[ 0\] NULL 00000000 000000 000000 00 0 0 0 + \[ 1\] .hash HASH 00000094 000094 000030 04 A 2 0 4 + \[ 2\] .dynsym DYNSYM 000000c4 0000c4 000070 10 A 3 2 4 + \[ 3\] .dynstr STRTAB 00000134 000134 00001d 00 A 0 0 1 + \[ 4\] .rela.dyn RELA 00000154 000154 00000c 0c A 2 0 4 + \[ 5\] .text PROGBITS 00000160 000160 000005 00 AX 0 0 4 + \[ 6\] .dynamic DYNAMIC 00200168 000168 000078 08 WA 3 0 4 + \[ 7\] .shstrtab STRTAB 00000000 0001e0 00004a 00 0 0 1 + \[ 8\] .symtab SYMTAB 00000000 0003bc 0000f0 10 9 10 4 + \[ 9\] .strtab STRTAB 00000000 0004ac 00005d 00 0 0 1 +Key to Flags: + W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), l \(large\) + I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\) + O \(extra OS processing required\) o \(OS specific\), p \(processor specific\) + +Dynamic section at offset 0x168 contains 10 entries: + Tag Type Name/Value + 0x00000004 \(HASH\) 0x94 + 0x00000005 \(STRTAB\) 0x134 + 0x00000006 \(SYMTAB\) 0xc4 + 0x0000000a \(STRSZ\) 29 \(bytes\) + 0x0000000b \(SYMENT\) 16 \(bytes\) + 0x00000007 \(RELA\) 0x154 + 0x00000008 \(RELASZ\) 12 \(bytes\) + 0x00000009 \(RELAENT\) 12 \(bytes\) + 0x00000016 \(TEXTREL\) 0x0 + 0x00000000 \(NULL\) 0x0 diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 8e83ca80459..3aec797619a 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -175,6 +175,7 @@ run_dump_test "compressed1" run_dump_test "ilp32-1" run_dump_test "ilp32-2" run_dump_test "ilp32-3" +run_dump_test "ilp32-4" run_dump_test "ia32-1" run_dump_test "ia32-2" run_dump_test "ia32-3" -- 2.30.2