From: H.J. Lu Date: Fri, 6 Feb 2015 12:25:36 +0000 (-0800) Subject: Properly mark the plugin symbol undefined X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9e2dec471006de3e0489a34fbeb922fee1e302af;p=binutils-gdb.git Properly mark the plugin symbol undefined Mark the unused plugin defined symbol in elf_link_input_bfd instead of _bfd_elf_fix_symbol_flags. Limit the PR ld/12365 test to x86 targets. bfd/ PR ld/12365 PR ld/14272 * elflink.c (_bfd_elf_fix_symbol_flags): Revert the last change. (elf_link_input_bfd): Mark the plugin symbol undefined if it is referenced from a non-IR file. ld/testsuite/ PR ld/12365 PR ld/14272 * ld-plugin/lto.exp: Run the PR ld/12365 test only for x86 targets. * ld-plugin/plugin-7.d: Updated. * ld-plugin/plugin-8.d: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f12a610b6de..1220455896a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2015-02-06 H.J. Lu + + PR ld/12365 + PR ld/14272 + * elflink.c (_bfd_elf_fix_symbol_flags): Revert the last change. + (elf_link_input_bfd): Mark the plugin symbol undefined if it is + referenced from a non-IR file. + 2015-02-06 Nick Clifton PR binutils/17512 diff --git a/bfd/elflink.c b/bfd/elflink.c index 604cfb6d8ff..e8c4ad48c46 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -2423,20 +2423,6 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h, } else { - /* If a plugin symbol is referenced from a non-IR file, mark - the symbol as undefined, except for symbol for linker - created section. */ - if (h->root.non_ir_ref - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && (h->root.u.def.section->flags & SEC_LINKER_CREATED) == 0 - && h->root.u.def.section->owner != NULL - && (h->root.u.def.section->owner->flags & BFD_PLUGIN) != 0) - { - h->root.type = bfd_link_hash_undefined; - h->root.u.undef.abfd = h->root.u.def.section->owner; - } - /* Unfortunately, NON_ELF is only correct if the symbol was first seen in a non-ELF file. Fortunately, if the symbol was first seen in an ELF file, we're probably OK unless the @@ -9807,6 +9793,22 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd) s_type = h->type; + /* If a plugin symbol is referenced from a non-IR file, + mark the symbol as undefined, except for symbol for + linker created section. */ + if (h->root.non_ir_ref + && (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak) + && (h->root.u.def.section->flags + & SEC_LINKER_CREATED) == 0 + && h->root.u.def.section->owner != NULL + && (h->root.u.def.section->owner->flags + & BFD_PLUGIN) != 0) + { + h->root.type = bfd_link_hash_undefined; + h->root.u.undef.abfd = h->root.u.def.section->owner; + } + ps = NULL; if (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1041bd1b3d8..075016bf757 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-02-06 H.J. Lu + + PR ld/12365 + PR ld/14272 + * ld-plugin/lto.exp: Run the PR ld/12365 test only for x86 targets. + * ld-plugin/plugin-7.d: Updated. + * ld-plugin/plugin-8.d: Likewise. + 2015-02-04 H.J. Lu * ld-plugin/lto.exp: Pass -flto-partition=none to the PR diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index 065e1bbcd08..6d9500bcf7f 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -383,12 +383,23 @@ if {![string match "" $catch_output]} { if { [at_least_gcc_version 4 7] } { # Check expected LTO linker errors. - set testname "PR ld/12365" - set exec_output [run_host_cmd "$CC" "-O2 -flto -flto-partition=none -fuse-linker-plugin tmpdir/pr12365a.o tmpdir/pr12365b.o tmpdir/pr12365c.o"] - if { [ regexp "undefined reference to `my_bcopy'" $exec_output ] } { - pass $testname - } { - fail $testname + # Since the asm symbol name hack in pr12365b.c doesn't work on all + # targets, run PR ld/12365 tests only for known targets. + if { ([istarget "i?86-*-elf*"] + || (([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"]) + && ![istarget "*-*-*aout*"] + && ![istarget "*-*-*oldld*"]) + || [istarget "i?86-*-nacl*"] + || [istarget "x86_64-*-nacl*"] + || [istarget "x86_64-*-linux*"] + || [istarget "amd64-*-linux*"]) } { + set testname "PR ld/12365" + set exec_output [run_host_cmd "$CC" "-O2 -flto -flto-partition=none -fuse-linker-plugin tmpdir/pr12365a.o tmpdir/pr12365b.o tmpdir/pr12365c.o"] + if { [ regexp "undefined reference to `my_bcopy'" $exec_output ] } { + pass $testname + } { + fail $testname + } } set testname "PR ld/12942 (3)" set exec_output [run_host_cmd "$CXX" "-O2 -flto -fuse-linker-plugin tmpdir/pr12942b.o tmpdir/pr12942a.o"] diff --git a/ld/testsuite/ld-plugin/plugin-7.d b/ld/testsuite/ld-plugin/plugin-7.d index 28a7036c720..d1c159c4f31 100644 --- a/ld/testsuite/ld-plugin/plugin-7.d +++ b/ld/testsuite/ld-plugin/plugin-7.d @@ -28,6 +28,7 @@ hook called: claim_file tmpdir/func.o \[@0/.* CLAIMED hook called: claim_file tmpdir/text.o \[@0/.* not claimed #... hook called: all symbols read. -`_?func' referenced in section `\.text.*' of tmpdir/main.o: defined in discarded section .* +tmpdir/main.o: In function `main': +.*main.c.*: undefined reference to `func' hook called: cleanup. #... diff --git a/ld/testsuite/ld-plugin/plugin-8.d b/ld/testsuite/ld-plugin/plugin-8.d index 8170b542c93..2c7a15b2414 100644 --- a/ld/testsuite/ld-plugin/plugin-8.d +++ b/ld/testsuite/ld-plugin/plugin-8.d @@ -32,6 +32,7 @@ hook called: claim_file tmpdir/text.o \[@0/.* not claimed hook called: all symbols read. Sym: '_?func' Resolution: LDPR_PREVAILING_DEF Sym: '_?func2' Resolution: LDPR_PREVAILING_DEF_IRONLY -`_?func' referenced in section `\.text.*' of tmpdir/main.o: defined in discarded section .* +tmpdir/main.o: In function `main': +.*main.c.*: undefined reference to `func' hook called: cleanup. #...