* pe-dll.c (generate_reloc): Take account of wrapper options when
authorDave Korn <dave.korn@artimi.com>
Thu, 17 Dec 2009 19:51:35 +0000 (19:51 +0000)
committerDave Korn <dave.korn@artimi.com>
Thu, 17 Dec 2009 19:51:35 +0000 (19:51 +0000)
testing if a weak symbol is defined or not, and when it is not,
consider whether the default value requires a base reloc anyway.

ld/ChangeLog
ld/pe-dll.c

index 261cdc8080c20c02781ae2a2a6252d57405a8676..00df7969bba6e9b05e6effcab5d80e23f204fe84 100644 (file)
@@ -1,3 +1,9 @@
+2009-12-17  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+       * pe-dll.c (generate_reloc): Take account of wrapper options when
+       testing if a weak symbol is defined or not, and when it is not,
+       consider whether the default value requires a base reloc anyway.
+
 2009-12-17  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * deffilep.y (def_file_free): Add missing shadow parameter renaming.
index 9b3c699fb17f55482d07db6ae38f2596a5070a56..2ddbdc16c4dfacde5406cb7ca3a9af08737a76fc 100644 (file)
@@ -1361,10 +1361,29 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
                  if (sym->flags == BSF_WEAK)
                    {
                      struct bfd_link_hash_entry *blhe
-                       = bfd_link_hash_lookup (info->hash, sym->name,
+                       = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
                                                FALSE, FALSE, FALSE);
-                     if (!blhe || blhe->type != bfd_link_hash_defined)
-                       continue;                     
+                     if (blhe && blhe->type == bfd_link_hash_undefweak)
+                       {
+                         /* Check aux sym and see if it is defined or not. */
+                         struct coff_link_hash_entry *h, *h2;
+                         h = (struct coff_link_hash_entry *)blhe;
+                         if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
+                           continue;
+                         h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
+                                               [h->aux->x_sym.x_tagndx.l];
+                         /* We don't want a base reloc if the aux sym is not
+                            found, undefined, or if it is the constant ABS
+                            zero default value.  (We broaden that slightly by
+                            not testing the value, just the section; there's
+                            no reason we'd want a reference to any absolute
+                            address to get relocated during rebasing).  */
+                         if (!h2 || h2->root.type == bfd_link_hash_undefined
+                               || h2->root.u.def.section == &bfd_abs_section)
+                           continue;
+                       }
+                     else if (!blhe || blhe->type != bfd_link_hash_defined)
+                       continue;
                    }
 
                  sym_vma = (relocs[i]->addend