Don't re-export common symbols

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.
This commit is contained in:
H.J. Lu
2015-10-05 14:45:17 -07:00
parent e753e154bf
commit a0d49154d4
5 changed files with 23 additions and 3 deletions

@ -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,

@ -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)

@ -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.

@ -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 {

@ -2,3 +2,4 @@
.data
exclude_sym:
.long 0
.common exclude_common, 4, 4