* elf32-xtensa.c (elf_xtensa_relocate_section): Return after
authorBob Wilson <bob.wilson@acm.org>
Wed, 11 Oct 2006 22:16:50 +0000 (22:16 +0000)
committerBob Wilson <bob.wilson@acm.org>
Wed, 11 Oct 2006 22:16:50 +0000 (22:16 +0000)
unresolvable relocation error.
(elf_xtensa_finish_dynamic_symbol): Set value of undefined, weak
symbols to zero.

bfd/ChangeLog
bfd/elf32-xtensa.c

index 2959a4918381ded0a762696e59e70bdcb2b7ea21..b7db1d8bd9ba4de695b6f9b673c4a545a04f0a05 100644 (file)
@@ -1,3 +1,10 @@
+2006-10-11  Bob Wilson  <bob.wilson@acm.org>
+
+       * elf32-xtensa.c (elf_xtensa_relocate_section): Return after
+       unresolvable relocation error.
+       (elf_xtensa_finish_dynamic_symbol): Set value of undefined, weak
+       symbols to zero.
+
 2006-10-10  Bob Wilson  <bob.wilson@acm.org>
 
        * elf32-xtensa.c (elf_xtensa_size_dynamic_sections): Add DT_DEBUG
index c93f84d8c7651469323c78b644271d70e06b1192..a5d76b214dc401fede8dc3248ef7b3dfa642250f 100644 (file)
@@ -2259,13 +2259,16 @@ elf_xtensa_relocate_section (bfd *output_bfd,
       if (unresolved_reloc
          && !((input_section->flags & SEC_DEBUGGING) != 0
               && h->def_dynamic))
-       (*_bfd_error_handler)
-         (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
-          input_bfd,
-          input_section,
-          (long) rel->r_offset,
-          howto->name,
-          h->root.root.string);
+       {
+         (*_bfd_error_handler)
+           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
+            input_bfd,
+            input_section,
+            (long) rel->r_offset,
+            howto->name,
+            h->root.root.string);
+         return FALSE;
+       }
 
       /* There's no point in calling bfd_perform_relocation here.
         Just go directly to our "special function".  */
@@ -2326,12 +2329,17 @@ elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
                                  struct elf_link_hash_entry *h,
                                  Elf_Internal_Sym *sym)
 {
-  if (h->needs_plt
-      && !h->def_regular)
+  if (h->needs_plt && !h->def_regular)
     {
       /* Mark the symbol as undefined, rather than as defined in
         the .plt section.  Leave the value alone.  */
       sym->st_shndx = SHN_UNDEF;
+      /* If the symbol is weak, we do need to clear the value.
+        Otherwise, the PLT entry would provide a definition for
+        the symbol even if the symbol wasn't defined anywhere,
+        and so the symbol would never be NULL.  */
+      if (!h->ref_regular_nonweak)
+       sym->st_value = 0;
     }
 
   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */