aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2003-05-20 14:35:01 +0000
committerH.J. Lu <hjl.tools@gmail.com>2003-05-20 14:35:01 +0000
commit22d5e339189d245f554b4f3c93f17441177fddcd (patch)
treed067924e009250533d0ddd12ccdd4e4643dc250b
parent39b8215104530f77b176829f831b7d9790eb9a6a (diff)
downloadgdb-22d5e339189d245f554b4f3c93f17441177fddcd.zip
gdb-22d5e339189d245f554b4f3c93f17441177fddcd.tar.gz
gdb-22d5e339189d245f554b4f3c93f17441177fddcd.tar.bz2
bfd/
2003-05-20 Jakub Jelinek <jakub@redhat.com> * 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 <hongjiu.lu@intel.com> * 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 <jakub@redhat.com> * ld-elfvsb/common.c: New file. * ld-elfvsb/elfvsb.exp: Add common. 2003-05-20 H.J. Lu <hongjiu.lu@intel.com> * ld-elfvsb/sh3.c: New file. * ld-elfvsb/test.c: Likewise. * ld-elfvsb/elfvsb.exp: Add new weak hidden symbol tests.
-rw-r--r--bfd/ChangeLog11
-rw-r--r--bfd/elflink.c3
-rw-r--r--bfd/elflink.h2
-rw-r--r--ld/testsuite/ChangeLog12
-rw-r--r--ld/testsuite/ld-elfvsb/common.c14
-rw-r--r--ld/testsuite/ld-elfvsb/elfvsb.exp33
-rw-r--r--ld/testsuite/ld-elfvsb/sh3.c7
-rw-r--r--ld/testsuite/ld-elfvsb/test.c26
8 files changed, 106 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 646cdd5..87117ef 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2003-05-20 Jakub Jelinek <jakub@redhat.com>
+
+ * 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 <hongjiu.lu@intel.com>
+
+ * 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 <jle@rice.edu>
* elf32-i860.c (elf32_i860_relocate_highadj): Simplify calculation.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 3b0d353..cc31186 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 ab8c7de..7b32491 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 cb4f33d..7404d72 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+2003-05-20 Jakub Jelinek <jakub@redhat.com>
+
+ * ld-elfvsb/common.c: New file.
+ * ld-elfvsb/elfvsb.exp: Add common.
+
+2003-05-20 H.J. Lu <hongjiu.lu@intel.com>
+
+ * 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 <hongjiu.lu@intel.com>
* 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 0000000..7d05eb7
--- /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 66546dc..d30858a 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 0000000..a6d5dc8
--- /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 0000000..ca23d38
--- /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 ();
+}