x86-64: Handle undefined IFUNC symbol with -z now
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 19 Apr 2017 16:59:14 +0000 (09:59 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 19 Apr 2017 16:59:30 +0000 (09:59 -0700)
Since undefined IFUNC symbol is treated as normal FUNC symbol, don't
abort on undefined IFUNC symbol in the second PLT.

bfd/

PR ld/21401
* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Don't abort
on on undefined IFUNC symbol in the second PLT.

ld/

PR ld/21401
* testsuite/ld-ifunc/ifunc.exp: Add a libtest-2-now.so test with
-z now.

bfd/ChangeLog
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-ifunc/ifunc.exp

index 8abbfcb258198697f1ad7c2a12c4b17ba56be1c3..11fbdab1b23a8e23f2d035a9951f40cad49f8c18 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21401
+       * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Don't abort
+       on on undefined IFUNC symbol in the second PLT.
+
 2017-04-19  Wedson Almeida Filho  <wedsonaf@gmail.com>
 
        * peXXigen.c (pe_print_reloc): Correct chunk_end.
index bf10893da74772120ed9a7871927804d47fded9d..746b847744ed7a4ff4b56cb91f6741d8b2026d72 100644 (file)
@@ -6013,7 +6013,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
       got_offset = h->got.offset;
 
       if (got_offset == (bfd_vma) -1
-         || h->type == STT_GNU_IFUNC
+         || (h->type == STT_GNU_IFUNC && h->def_regular)
          || plt == NULL
          || got == NULL)
        abort ();
index c20ed75f0cab8f7511a6877e3138bb4f68044a5b..bccd2becc63e5a822a54ba0a98c535168752105c 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21401
+       * testsuite/ld-ifunc/ifunc.exp: Add a libtest-2-now.so test with
+       -z now.
+
 2017-04-19  Alan Modra  <amodra@gmail.com>
 
        * ld.texinfo (dynamic-undefined-weak): Document.
index ffff2f1ae56b03382456d253bc1a65025f8a614a..13d50a5b7223d39c6aa6bd9139d6d021925b0ab8 100644 (file)
@@ -234,6 +234,10 @@ if ![ld_link $ld "tmpdir/libtest-2.so" "-shared tmpdir/test-2.o"] {
     fail "Could not link libtest-2.so"
     set fails [expr $fails + 1]
 }
+if ![ld_link $ld "tmpdir/libtest-2-now.so" "-shared -z now tmpdir/test-2.o"] {
+    fail "Could not link libtest-2-now.so"
+    set fails [expr $fails + 1]
+}
 
 if { $fails == 0 } {
   pass "Building ifunc binaries"
@@ -306,6 +310,10 @@ if {[contains_ifunc_symbol tmpdir/libtest-2.so] != 0} {
     fail "libtest-2.so contains IFUNC symbols"
     set fails [expr $fails + 1]
 }
+if {[contains_ifunc_symbol tmpdir/libtest-2-now.so] != 0} {
+    fail "libtest-2-now.so contains IFUNC symbols"
+    set fails [expr $fails + 1]
+}
 
 # The linked ifunc using executables and shared libraries should contain
 # a dynamic reloc referencing the IFUNC symbol.  (Even the static