From: H.J. Lu Date: Tue, 20 May 2003 14:35:01 +0000 (+0000) Subject: bfd/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=22d5e339189d245f554b4f3c93f17441177fddcd;p=binutils-gdb.git bfd/ 2003-05-20 Jakub Jelinek * elflink.h (elf_link_output_extsym): Only issue error about != STV_DEFAULT symbols if they are bfd_link_hash_undefined. 2003-05-20 H.J. Lu * elflink.c (_bfd_elf_merge_symbol): Check ELF_LINK_DYNAMIC_DEF when removing the old definition for symbols with non-default visibility. ld/testsuite/ 2003-05-20 Jakub Jelinek * ld-elfvsb/common.c: New file. * ld-elfvsb/elfvsb.exp: Add common. 2003-05-20 H.J. Lu * ld-elfvsb/sh3.c: New file. * ld-elfvsb/test.c: Likewise. * ld-elfvsb/elfvsb.exp: Add new weak hidden symbol tests. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 646cdd5559b..87117efe4b2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2003-05-20 Jakub Jelinek + + * elflink.h (elf_link_output_extsym): Only issue error about != + STV_DEFAULT symbols if they are bfd_link_hash_undefined. + +2003-05-20 H.J. Lu + + * elflink.c (_bfd_elf_merge_symbol): Check ELF_LINK_DYNAMIC_DEF + when removing the old definition for symbols with non-default + visibility. + 2003-05-18 Jason Eckhardt * elf32-i860.c (elf32_i860_relocate_highadj): Simplify calculation. diff --git a/bfd/elflink.c b/bfd/elflink.c index 3b0d3531f2d..cc311863e1a 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -884,7 +884,8 @@ _bfd_elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip, if (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) { h->elf_link_hash_flags &= ~ELF_LINK_HASH_DEF_DYNAMIC; - h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC; + h->elf_link_hash_flags |= (ELF_LINK_HASH_REF_DYNAMIC + | ELF_LINK_DYNAMIC_DEF); } /* FIXME: Should we check type and size for protected symbol? */ h->size = 0; diff --git a/bfd/elflink.h b/bfd/elflink.h index ab8c7dec3b4..7b32491d945 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -4622,7 +4622,7 @@ elf_link_output_extsym (h, data) if (! finfo->info->relocateable && ELF_ST_VISIBILITY (sym.st_other) != STV_DEFAULT && ELF_ST_BIND (sym.st_info) != STB_WEAK - && h->root.type != bfd_link_hash_undefweak + && h->root.type == bfd_link_hash_undefined && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) { (*_bfd_error_handler) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index cb4f33db88e..7404d729565 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2003-05-20 Jakub Jelinek + + * ld-elfvsb/common.c: New file. + * ld-elfvsb/elfvsb.exp: Add common. + +2003-05-20 H.J. Lu + + * ld-elfvsb/sh3.c: New file. + * ld-elfvsb/test.c: Likewise. + + * ld-elfvsb/elfvsb.exp: Add new weak hidden symbol tests. + 2003-05-15 H.J. Lu * config/default.exp (gcc_ld_flag): New. Make the newly built diff --git a/ld/testsuite/ld-elfvsb/common.c b/ld/testsuite/ld-elfvsb/common.c new file mode 100644 index 00000000000..7d05eb7f8f8 --- /dev/null +++ b/ld/testsuite/ld-elfvsb/common.c @@ -0,0 +1,14 @@ +int foo; +asm (".hidden foo"); + +int +_start (void) +{ + return foo; +} + +int +__start (void) +{ + return _start (); +} diff --git a/ld/testsuite/ld-elfvsb/elfvsb.exp b/ld/testsuite/ld-elfvsb/elfvsb.exp index 66546dc8953..d30858a76b6 100644 --- a/ld/testsuite/ld-elfvsb/elfvsb.exp +++ b/ld/testsuite/ld-elfvsb/elfvsb.exp @@ -412,6 +412,39 @@ visibility_run protected_undef_def visibility_run protected_weak visibility_run normal +if { ![ld_compile "$CC -g $CFLAGS" $srcdir/$subdir/common.c tmpdir/common.o] } { + unresolved "common hidden symbol" +} else { + if ![ld_simple_link $ld tmpdir/common "tmpdir/common.o"] { + fail "common hidden symbol" + } else { + pass "common hidden symbol" + } +} + +if { ![ld_compile "$CC -g $CFLAGS" $srcdir/$subdir/test.c tmpdir/test.o] } { + unresolved "weak hidden symbol" +} else { + if { ![ld_compile "$CC -g $CFLAGS $picflag" $srcdir/$subdir/sh3.c tmpdir/sh3.o] } { + unresolved "weak hidden symbol" + } else { + if ![ld_simple_link $ld tmpdir/sh3.so "-shared tmpdir/sh3.o"] { + fail "weak hidden symbol" + } else { + if ![ld_simple_link $ld tmpdir/weak "tmpdir/test.o tmpdir/sh3.o"] { + fail "weak hidden symbol DSO last" + } else { + pass "weak hidden symbol DSO last" + } + if ![ld_simple_link $ld tmpdir/weak "tmpdir/sh3.so tmpdir/test.o"] { + fail "weak hidden symbol DSO first" + } else { + pass "weak hidden symbol DSO first" + } + } + } +} + if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } { # Remove the temporary directory. catch "exec rm -rf $tmpdir" exec_status diff --git a/ld/testsuite/ld-elfvsb/sh3.c b/ld/testsuite/ld-elfvsb/sh3.c new file mode 100644 index 00000000000..a6d5dc88637 --- /dev/null +++ b/ld/testsuite/ld-elfvsb/sh3.c @@ -0,0 +1,7 @@ +int main_hidden_data = 1; + +int +main_hidden_func () +{ + return 1; +} diff --git a/ld/testsuite/ld-elfvsb/test.c b/ld/testsuite/ld-elfvsb/test.c new file mode 100644 index 00000000000..ca23d38b1ef --- /dev/null +++ b/ld/testsuite/ld-elfvsb/test.c @@ -0,0 +1,26 @@ +#pragma weak main_hidden_data +extern int main_hidden_data; +asm (".hidden main_hidden_data"); + +#pragma weak main_hidden_func +extern int main_hidden_func (); +asm (".hidden main_hidden_func"); + +int +_start (void) +{ + int ret = 0; + + if (&main_hidden_data != 0) + ret = 1; + if (main_hidden_func != 0) + ret = 1; + + return ret; +} + +int +__start (void) +{ + return _start (); +}