This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Skip version check for unreferenced and undefined symbol


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f4ab0e2d1d4e14cfdddf46ac846c48ae55f4e14a

commit f4ab0e2d1d4e14cfdddf46ac846c48ae55f4e14a
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Jun 28 08:08:04 2016 -0700

    Skip version check for unreferenced and undefined symbol
    
    No need to check version if symbol is unreferenced and undefined.
    
    bfd/
    
    	PR ld/20306
    	* elflink.c (elf_link_check_versioned_symbol): Return false
    	for unreferenced undefined symbol.
    
    ld/testsuite/
    
    	* testsuite/ld-gc/gc.exp: Run pr20306 test.
    	* ld-gc/pr20306.c: New file.
    	* ld-gc/pr20306.d: Likewise.

Diff:
---
 bfd/ChangeLog                |  6 ++++++
 bfd/elflink.c                |  3 ++-
 ld/ChangeLog                 |  6 ++++++
 ld/testsuite/ld-gc/gc.exp    | 15 +++++++++++++++
 ld/testsuite/ld-gc/pr20306.c |  2 ++
 ld/testsuite/ld-gc/pr20306.d |  3 +++
 6 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8ad7d0d..9e2534e 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2016-06-28  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/20306
+	* elflink.c (elf_link_check_versioned_symbol): Return false
+	for unreferenced undefined symbol.
+
 2016-06-28  Nick Clifton  <nickc@redhat.com>
 
 	* elf32-bfin.c (bfin_adjust_dynamic_symbol): Fail if a COPY reloc
diff --git a/bfd/elflink.c b/bfd/elflink.c
index ad8493b..3e24940 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -9053,7 +9053,8 @@ elf_link_check_versioned_symbol (struct bfd_link_info *info,
     case bfd_link_hash_undefined:
     case bfd_link_hash_undefweak:
       abfd = h->root.u.undef.abfd;
-      if ((abfd->flags & DYNAMIC) == 0
+      if (abfd == NULL
+	  || (abfd->flags & DYNAMIC) == 0
 	  || (elf_dyn_lib_class (abfd) & DYN_DT_NEEDED) == 0)
 	return FALSE;
       break;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 631fec5..b7a5fd7 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2016-06-28  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* testsuite/ld-gc/gc.exp: Run pr20306 test.
+	* ld-gc/pr20306.c: New file.
+	* ld-gc/pr20306.d: Likewise.
+
 2016-06-28  Nick Clifton  <nickc@redhat.com>
 
 	* testsuite/ld-elf/comm-data.exp: Expect comm-data2 test to fail
diff --git a/ld/testsuite/ld-gc/gc.exp b/ld/testsuite/ld-gc/gc.exp
index ffc619c..a6f3e13 100644
--- a/ld/testsuite/ld-gc/gc.exp
+++ b/ld/testsuite/ld-gc/gc.exp
@@ -146,3 +146,18 @@ if { [is_remote host] || [which $CC] != 0 } {
     ld_compile "$CC $CFLAGS $cflags -O0" $srcdir/$subdir/pr19161-2.c tmpdir/pr19161-2.o
     run_dump_test "pr19161"
 }
+
+if { [is_elf_format] && [check_shared_lib_support] \
+     && ([is_remote host] || [which $CC] != 0) } {
+    run_cc_link_tests [list \
+	[list \
+	    "Build libpr20306.so" \
+	    "-shared" \
+	    "-fPIC" \
+	    {pr20306.c} \
+	    {} \
+	    "libpr20306.so" \
+	] \
+    ]
+    run_dump_test "pr20306"
+}
diff --git a/ld/testsuite/ld-gc/pr20306.c b/ld/testsuite/ld-gc/pr20306.c
new file mode 100644
index 0000000..0968c73
--- /dev/null
+++ b/ld/testsuite/ld-gc/pr20306.c
@@ -0,0 +1,2 @@
+extern void foo();
+void bar() {foo();}
diff --git a/ld/testsuite/ld-gc/pr20306.d b/ld/testsuite/ld-gc/pr20306.d
new file mode 100644
index 0000000..07cc8e8
--- /dev/null
+++ b/ld/testsuite/ld-gc/pr20306.d
@@ -0,0 +1,3 @@
+#source: dummy.s
+#ld: -u foo --gc-sections tmpdir/libpr20306.so
+#error: .* generated: undefined reference to `foo'


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]