From a0d49154d4a471cd36954408b29a348a091efaa3 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 5 Oct 2015 14:45:17 -0700 Subject: [PATCH] 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. --- 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 + + 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 * 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 + + PR ld/18914 + * ld-elf/exclude.exp: Also check exclude_common. + * ld-elf/exclude2.s: Add exclude_common. + 2015-10-02 Renlin Li * 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.7.4