[committed, PATCH] PR ld/18914: Shared lib created using static libs and "-Wl,--exclude-libs,ALL" export uninitialized variables

H.J. Lu hongjiu.lu@intel.com
Mon Oct 5 21:49:00 GMT 2015


For ELF linker, a common symbol isn't a definition.  When we decide if a
symbol should be re-exported, we should check if the symbol isn't
undefined, not if it is a definition.

bfd/

	PR ld/18914
	* elflink.c (elf_link_add_object_symbols): Don't re-export a
	symbol if it isn't undefined.

ld/testsuite/

	PR ld/18914
	* ld-elf/exclude.exp: Also check exclude_common.
	* ld-elf/exclude2.s: Add exclude_common.
---
 bfd/ChangeLog                   |  6 ++++++
 bfd/elflink.c                   |  2 +-
 ld/testsuite/ChangeLog          |  6 ++++++
 ld/testsuite/ld-elf/exclude.exp | 11 +++++++++--
 ld/testsuite/ld-elf/exclude2.s  |  1 +
 5 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7674750..db6fe6b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/18914
+	* elflink.c (elf_link_add_object_symbols): Don't re-export a
+	symbol if it isn't undefined.
+
 2015-10-04  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* config.bfd (targ_selvecs, targ64_selvecs): Add iamcu_elf32_vec,
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 90af6cf..94bb710 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -4216,7 +4216,7 @@ error_free_dyn:
 
 	  /* If this symbol has default visibility and the user has
 	     requested we not re-export it, then mark it as hidden.  */
-	  if (definition
+	  if (!bfd_is_und_section (sec)
 	      && !dynamic
 	      && abfd->no_export
 	      && ELF_ST_VISIBILITY (isym->st_other) != STV_INTERNAL)
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index b078d3a..490aa50 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/18914
+	* ld-elf/exclude.exp: Also check exclude_common.
+	* ld-elf/exclude2.s: Add exclude_common.
+
 2015-10-02  Renlin Li  <renlin.li@arm.com>
 
 	* ld-aarch64/aarch64-elf.exp (tls-relax-large-le-ie): Run new test.
diff --git a/ld/testsuite/ld-elf/exclude.exp b/ld/testsuite/ld-elf/exclude.exp
index 3b0539d..1b96dac 100644
--- a/ld/testsuite/ld-elf/exclude.exp
+++ b/ld/testsuite/ld-elf/exclude.exp
@@ -83,7 +83,8 @@ if { [ld_simple_link $ld tmpdir/exclude.so "--shared tmpdir/exclude1.o -Ltmpdir
 
 if ![ld_nm $nm "-D" tmpdir/exclude.so] {
     unresolved $test2
-} elseif { [info exists nm_output(exclude_sym)] } {
+} elseif { [info exists nm_output(exclude_common)]
+	    && [info exists nm_output(exclude_sym)] } {
     pass $test2
 } else {
     fail $test2
@@ -99,7 +100,8 @@ if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude --shared t
 
 if ![ld_nm $nm "-D" tmpdir/exclude.so] {
     unresolved $test4
-} elseif { ! [info exists nm_output(exclude_sym)] } {
+} elseif { ! [info exists nm_output(exclude_common)]
+	   &&  ! [info exists nm_output(exclude_sym)] } {
     pass $test4
 } else {
     fail $test4
@@ -109,6 +111,7 @@ if ![ld_nm $nm "-D" tmpdir/exclude.so] {
 
 if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
      && [ld_nm $nm "-D" tmpdir/exclude.so]
+     && ! [info exists nm_output(exclude_common)]
      && ! [info exists nm_output(exclude_sym)] } {
     pass $test5
 } else {
@@ -117,6 +120,7 @@ if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude.a --shared
 
 if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs ALL --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
      && [ld_nm $nm "-D" tmpdir/exclude.so]
+     && ! [info exists nm_output(exclude_common)]
      && ! [info exists nm_output(exclude_sym)] } {
     pass $test6
 } else {
@@ -125,6 +129,7 @@ if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs ALL --shared tmpdir/e
 
 if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
      && [ld_nm $nm "-D" tmpdir/exclude.so]
+     && ! [info exists nm_output(exclude_common)]
      && ! [info exists nm_output(exclude_sym)] } {
     pass $test7
 } else {
@@ -133,6 +138,7 @@ if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:libexclude.a --sh
 
 if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo,libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
      && [ld_nm $nm "-D" tmpdir/exclude.so]
+     && ! [info exists nm_output(exclude_common)]
      && ! [info exists nm_output(exclude_sym)] } {
     pass $test8
 } else {
@@ -141,6 +147,7 @@ if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo,libexclude.a --sh
 
 if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:bar --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
      && [ld_nm $nm "-D" tmpdir/exclude.so]
+     && [info exists nm_output(exclude_common)]
      && [info exists nm_output(exclude_sym)] } {
     pass $test9
 } else {
diff --git a/ld/testsuite/ld-elf/exclude2.s b/ld/testsuite/ld-elf/exclude2.s
index e9b5819..f6ade79 100644
--- a/ld/testsuite/ld-elf/exclude2.s
+++ b/ld/testsuite/ld-elf/exclude2.s
@@ -2,3 +2,4 @@
 	.data
 exclude_sym:
 	.long	0
+	.common exclude_common, 4, 4
-- 
2.4.3



More information about the Binutils mailing list