OSDN Git Service

* pe-dll.c (generate_reloc): Take account of wrapper options when
authordavek <davek>
Fri, 18 Dec 2009 04:51:35 +0000 (04:51 +0000)
committerdavek <davek>
Fri, 18 Dec 2009 04:51:35 +0000 (04: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 261cdc8..00df796 100644 (file)
@@ -1,5 +1,11 @@
 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.
        (def_file_print): Likewise.
        (def_stash_module): Likewise.
index 9b3c699..2ddbdc1 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