bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 23 Jul 2007 09:56:19 +0000 (09:56 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Mon, 23 Jul 2007 09:56:19 +0000 (09:56 +0000)
* elflink.c (_bfd_elf_fix_symbol_flags): Only assert the type
of weakdef->root.type if weakdef has no regular definition.

ld/testsuite/
* ld-elf/weak-dyn-1a.s, ld-elf/weak-dyn-1b.s, ld-elf/weak-dyn-1.ld,
* ld-elf/weak-dyn-1.rd: New test.
* ld-elf/elf.exp: Run it.

bfd/ChangeLog
bfd/elflink.c
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/elf.exp
ld/testsuite/ld-elf/weak-dyn-1.ld [new file with mode: 0644]
ld/testsuite/ld-elf/weak-dyn-1.rd [new file with mode: 0644]
ld/testsuite/ld-elf/weak-dyn-1a.s [new file with mode: 0644]
ld/testsuite/ld-elf/weak-dyn-1b.s [new file with mode: 0644]

index 6dce3309397a1e9c680bee1c2511319bce5221cd..5d3c93922853c1e677a6d9e3e6cbcd8e3d591a61 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-23  Richard Sandiford  <richard@codesourcery.com>
+
+       * elflink.c (_bfd_elf_fix_symbol_flags): Only assert the type
+       of weakdef->root.type if weakdef has no regular definition.
+
 2007-07-22  Adam Nemet  <anemet@caviumnetworks.com>
 
        * elfxx-mips.c (struct mips_elf_link_hash_table): Add new field
index a68d736ab5ab3a9b0f7211e978dceb328cb961f7..cd8b756d66ca63878e18a8458127fa00810f2aa6 100644 (file)
@@ -2492,8 +2492,6 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
 
       BFD_ASSERT (h->root.type == bfd_link_hash_defined
                  || h->root.type == bfd_link_hash_defweak);
-      BFD_ASSERT (weakdef->root.type == bfd_link_hash_defined
-                 || weakdef->root.type == bfd_link_hash_defweak);
       BFD_ASSERT (weakdef->def_dynamic);
 
       /* If the real definition is defined by a regular object file,
@@ -2502,8 +2500,11 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
       if (weakdef->def_regular)
        h->u.weakdef = NULL;
       else
-       (*bed->elf_backend_copy_indirect_symbol) (eif->info, weakdef,
-                                                 h);
+       {
+         BFD_ASSERT (weakdef->root.type == bfd_link_hash_defined
+                     || weakdef->root.type == bfd_link_hash_defweak);
+         (*bed->elf_backend_copy_indirect_symbol) (eif->info, weakdef, h);
+       }
     }
 
   return TRUE;
index 2f49bdd31613849a9e5d2b3f8041d8b2dbf6a4fc..4b82886b24c65b2a4e6d922eecdf6c5cd830d767 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-23  Richard Sandiford  <richard@codesourcery.com>
+
+       * ld-elf/weak-dyn-1a.s, ld-elf/weak-dyn-1b.s, ld-elf/weak-dyn-1.ld,
+       * ld-elf/weak-dyn-1.rd: New test.
+       * ld-elf/elf.exp: Run it.
+
 2007-07-13  Nathan Sidwell  <nathan@codesourcery.com>
 
        * ld-scripts/assert.t: Tweak to avoid relying on empty's VMA being
index 51780d35c128114bda4cfe0019b3a9fac836873f..20e998077d1823a62e1021aaf02d8bcd53c6dcdc 100644 (file)
@@ -36,6 +36,19 @@ foreach t $test_list {
     run_dump_test [file rootname $t]
 }
 
+if { [istarget *-*-linux*] } {
+    run_ld_link_tests {
+       {"Weak symbols in dynamic objects 1 (support)"
+           "-shared" "" {weak-dyn-1a.s}
+           {}
+           "libweakdyn1a.so"}
+       {"Weak symbols in dynamic objects 1 (main test)"
+           "-shared tmpdir/libweakdyn1a.so -Tweak-dyn-1.ld" "" {weak-dyn-1b.s}
+           {{readelf {--relocs --wide} weak-dyn-1.rd}}
+           "libweakdyn1b.so"}
+    }
+}
+
 # The following tests require running the executable generated by ld.
 if ![isnative] {
     return
diff --git a/ld/testsuite/ld-elf/weak-dyn-1.ld b/ld/testsuite/ld-elf/weak-dyn-1.ld
new file mode 100644 (file)
index 0000000..495b712
--- /dev/null
@@ -0,0 +1,8 @@
+SECTIONS
+{
+  . = 0x800000;
+  PROVIDE (bar = .);
+  .data : {
+    *(.data)
+  }
+}
diff --git a/ld/testsuite/ld-elf/weak-dyn-1.rd b/ld/testsuite/ld-elf/weak-dyn-1.rd
new file mode 100644 (file)
index 0000000..169abd8
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+0+800000 .* foo.*
+#pass
diff --git a/ld/testsuite/ld-elf/weak-dyn-1a.s b/ld/testsuite/ld-elf/weak-dyn-1a.s
new file mode 100644 (file)
index 0000000..d77c32e
--- /dev/null
@@ -0,0 +1,13 @@
+       .globl  foo
+       .weak   foo
+       .type   foo,%object
+       .size   foo,1
+
+       .globl  bar
+       .type   bar,%object
+       .size   bar,1
+
+       .data
+foo:
+bar:
+       .dc.a   data_begin
diff --git a/ld/testsuite/ld-elf/weak-dyn-1b.s b/ld/testsuite/ld-elf/weak-dyn-1b.s
new file mode 100644 (file)
index 0000000..a3c3fa5
--- /dev/null
@@ -0,0 +1,3 @@
+       .data
+       .dc.a   foo
+       .dc.a   data_begin