On Sat, Apr 30, 2011 at 6:13 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sat, Apr 30, 2011 at 4:57 PM, Alan Modra <amo...@gmail.com> wrote: >> On Fri, Apr 29, 2011 at 05:07:33PM -0700, Roland McGrath wrote: >>> I am seeing a strange thing. The (BFD) linker spuriously generates .plt >>> and .rela.plt sections (both empty) for a link that has no need for them. >>> It's reproduced with a trivial example, and seen on today's binutils trunk. >>> Gold does not produce the empty sections. >> >> HJ, please verify that this fix doesn't break anything else. >> >> Index: bfd/elf64-x86-64.c >> =================================================================== >> RCS file: /cvs/src/src/bfd/elf64-x86-64.c,v >> retrieving revision 1.223 >> diff -u -p -r1.223 elf64-x86-64.c >> --- bfd/elf64-x86-64.c 23 Apr 2011 01:16:31 -0000 1.223 >> +++ bfd/elf64-x86-64.c 30 Apr 2011 23:50:57 -0000 >> @@ -1261,7 +1261,9 @@ elf_x86_64_check_relocs (bfd *abfd, stru >> case R_X86_64_PLT32: >> case R_X86_64_GOTPCREL: >> case R_X86_64_GOTPCREL64: >> - if (!_bfd_elf_create_ifunc_sections (abfd, info)) >> + if (htab->elf.dynobj == NULL) >> + htab->elf.dynobj = abfd; >> + if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info)) >> return FALSE; >> break; >> } >> Index: bfd/elf32-i386.c >> =================================================================== >> RCS file: /cvs/src/src/bfd/elf32-i386.c,v >> retrieving revision 1.251 >> diff -u -p -r1.251 elf32-i386.c >> --- bfd/elf32-i386.c 23 Apr 2011 01:16:31 -0000 1.251 >> +++ bfd/elf32-i386.c 30 Apr 2011 23:50:59 -0000 >> @@ -1376,7 +1376,9 @@ elf_i386_check_relocs (bfd *abfd, >> case R_386_PLT32: >> case R_386_GOT32: >> case R_386_GOTOFF: >> - if (!_bfd_elf_create_ifunc_sections (abfd, info)) >> + if (htab->elf.dynobj == NULL) >> + htab->elf.dynobj = abfd; >> + if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info)) >> return FALSE; >> break; >> } > > It works.
I checked in 2 testcases. -- H.J. --- diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1fd011e..8909846 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2011-05-01 H.J. Lu <hongjiu...@intel.com> + + PR ld/12718 + * ld-i386/i386.exp: Run pr12718. + * ld-x86-64/x86-64.exp: Likewise. + + * ld-i386/pr12718.d: New. + * ld-i386/pr12718.s: Likewise. + * ld-x86-64/pr12718.d: Likewise. + * ld-x86-64/pr12718.s: Likewise. + 2011-04-26 Kai Tietz <kti...@redhat.com> * ld-pe/pe.exp: Add cfi/cfi32 tests. diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index cc82e15..3bce2d3 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -194,6 +194,7 @@ run_dump_test "tlspie2" run_dump_test "nogot1" run_dump_test "nogot2" run_dump_test "discarded1" +run_dump_test "pr12718" if { !([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"] diff --git a/ld/testsuite/ld-i386/pr12718.d b/ld/testsuite/ld-i386/pr12718.d new file mode 100644 index 0000000..57eea4e --- /dev/null +++ b/ld/testsuite/ld-i386/pr12718.d @@ -0,0 +1,19 @@ +#name: PR ld/12718 +#as: --32 +#ld: -melf_i386 +#readelf: -S + +There are 5 section headers, starting at offset 0x7c: + +Section Headers: + \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al + \[ 0\] NULL 00000000 000000 000000 00 0 0 0 + \[ 1\] .text PROGBITS 08048054 000054 000006 00 AX 0 0 4 + \[ 2\] .shstrtab STRTAB 00000000 00005a 000021 00 0 0 1 + \[ 3\] .symtab SYMTAB 00000000 000144 000070 10 4 2 4 + \[ 4\] .strtab STRTAB 00000000 0001b4 000024 00 0 0 1 +Key to Flags: + W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\) + I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\) + O \(extra OS processing required\) o \(OS specific\), p \(processor specific\) +#pass diff --git a/ld/testsuite/ld-i386/pr12718.s b/ld/testsuite/ld-i386/pr12718.s new file mode 100644 index 0000000..162704e --- /dev/null +++ b/ld/testsuite/ld-i386/pr12718.s @@ -0,0 +1,4 @@ +.globl foo +foo: ret +.globl _start +_start: call foo diff --git a/ld/testsuite/ld-x86-64/pr12718.d b/ld/testsuite/ld-x86-64/pr12718.d new file mode 100644 index 0000000..ed04fd6 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr12718.d @@ -0,0 +1,19 @@ +#name: PR ld/12718 +#as: --64 +#ld: -melf_x86_64 +#readelf: -S --wide + +There are 5 section headers, starting at offset 0xa0: + +Section Headers: + \[Nr\] Name Type Address Off Size ES Flg Lk Inf Al + \[ 0\] NULL 0000000000000000 000000 000000 00 0 0 0 + \[ 1\] .text PROGBITS 0000000000400078 000078 000006 00 AX 0 0 4 + \[ 2\] .shstrtab STRTAB 0000000000000000 00007e 000021 00 0 0 1 + \[ 3\] .symtab SYMTAB 0000000000000000 0001e0 0000a8 18 4 2 8 + \[ 4\] .strtab STRTAB 0000000000000000 000288 000024 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\) +#pass diff --git a/ld/testsuite/ld-x86-64/pr12718.s b/ld/testsuite/ld-x86-64/pr12718.s new file mode 100644 index 0000000..162704e --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr12718.s @@ -0,0 +1,4 @@ +.globl foo +foo: ret +.globl _start +_start: call foo diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 8e97729..c77640b 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -155,6 +155,7 @@ run_dump_test "unique1" run_dump_test "nogot1" run_dump_test "nogot2" run_dump_test "discarded1" +run_dump_test "pr12718" if { ![istarget "x86_64-*-linux*"] } { return _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils