* elf32-m68k.c (elf_m68k_relocate_section): Replace ugly
authorAndreas Schwab <schwab@linux-m68k.org>
Sun, 11 May 2003 16:19:12 +0000 (16:19 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Sun, 11 May 2003 16:19:12 +0000 (16:19 +0000)
complicated tests for unresolvable relocs with a simple direct
scheme using "unresolved_reloc" var.  Report some detail on
bfd_reloc_outofrange and similar errors.

bfd/ChangeLog
bfd/elf32-m68k.c

index 0cf4ea341ad43a129c17035ca40c1b234f0d57d2..3517dd46bdeaec6c2ff5acd8e87e03f9935cb2fb 100644 (file)
@@ -1,3 +1,10 @@
+2003-05-11  Andreas Schwab  <schwab@suse.de>
+
+       * elf32-m68k.c (elf_m68k_relocate_section): Replace ugly
+       complicated tests for unresolvable relocs with a simple direct
+       scheme using "unresolved_reloc" var.  Report some detail on
+       bfd_reloc_outofrange and similar errors.
+
 2003-05-09  Martin Schwidefsky  <schwidefsky@de.ibm.com>
 
        * elf32-s390.c (allocate_dynrelocs, elf_s390_relocate_section):
index e314ebb4b94dee61e359a87449b09021ce518afa..fc3a2af74412ce51c83161a904ebb5ce1ec9267a 100644 (file)
@@ -1380,6 +1380,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
       Elf_Internal_Sym *sym;
       asection *sec;
       bfd_vma relocation;
+      bfd_boolean unresolved_reloc;
       bfd_reloc_status_type r;
 
       r_type = ELF32_R_TYPE (rel->r_info);
@@ -1395,6 +1396,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
       h = NULL;
       sym = NULL;
       sec = NULL;
+      unresolved_reloc = FALSE;
       if (r_symndx < symtab_hdr->sh_info)
        {
          sym = local_syms + r_symndx;
@@ -1407,71 +1409,29 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
          while (h->root.type == bfd_link_hash_indirect
                 || h->root.type == bfd_link_hash_warning)
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+         relocation = 0;
          if (h->root.type == bfd_link_hash_defined
              || h->root.type == bfd_link_hash_defweak)
            {
              sec = h->root.u.def.section;
-             if (((r_type == R_68K_PLT8
-                   || r_type == R_68K_PLT16
-                   || r_type == R_68K_PLT32
-                   || r_type == R_68K_PLT8O
-                   || r_type == R_68K_PLT16O
-                   || r_type == R_68K_PLT32O)
-                  && h->plt.offset != (bfd_vma) -1
-                  && elf_hash_table (info)->dynamic_sections_created)
-                 || ((r_type == R_68K_GOT8O
-                      || r_type == R_68K_GOT16O
-                      || r_type == R_68K_GOT32O
-                      || ((r_type == R_68K_GOT8
-                           || r_type == R_68K_GOT16
-                           || r_type == R_68K_GOT32)
-                          && strcmp (h->root.root.string,
-                                     "_GLOBAL_OFFSET_TABLE_") != 0))
-                     && (WILL_CALL_FINISH_DYNAMIC_SYMBOL
-                         (elf_hash_table (info)->dynamic_sections_created,
-                          info->shared, h))
-                     && (! info->shared
-                         || (! info->symbolic
-                             && h->dynindx != -1
-                             && (h->elf_link_hash_flags
-                                 & ELF_LINK_FORCED_LOCAL) == 0)
-                         || (h->elf_link_hash_flags
-                             & ELF_LINK_HASH_DEF_REGULAR) == 0))
-                 || (info->shared
-                     && ((! info->symbolic && h->dynindx != -1)
-                         || (h->elf_link_hash_flags
-                             & ELF_LINK_HASH_DEF_REGULAR) == 0)
-                     && ((input_section->flags & SEC_ALLOC) != 0
-                         /* DWARF will emit R_68K_32 relocations in its
-                            sections against symbols defined externally
-                            in shared libraries.  We can't do anything
-                            with them here.  */
-                         || ((input_section->flags & SEC_DEBUGGING) != 0
-                             && (h->elf_link_hash_flags
-                                 & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
-                     && (r_type == R_68K_8
-                         || r_type == R_68K_16
-                         || r_type == R_68K_32
-                         || r_type == R_68K_PC8
-                         || r_type == R_68K_PC16
-                         || r_type == R_68K_PC32)))
-               {
-                 /* In these cases, we don't need the relocation
-                    value.  We check specially because in some
-                    obscure cases sec->output_section will be NULL.  */
-                 relocation = 0;
-               }
+             if (sec->output_section == NULL)
+               /* Set a flag that will be cleared later if we find a
+                  relocation value for this symbol.  output_section
+                  is typically NULL for symbols satisfied by a shared
+                  library.  */
+               unresolved_reloc = TRUE;
              else
                relocation = (h->root.u.def.value
                              + sec->output_section->vma
                              + sec->output_offset);
            }
          else if (h->root.type == bfd_link_hash_undefweak)
-           relocation = 0;
+           ;
          else if (info->shared
                   && !info->no_undefined
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
-           relocation = 0;
+           ;
          else
            {
              if (!(info->callbacks->undefined_symbol
@@ -1480,7 +1440,6 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
                     (!info->shared || info->no_undefined
                      || ELF_ST_VISIBILITY (h->other)))))
                return FALSE;
-             relocation = 0;
            }
        }
 
@@ -1546,6 +1505,8 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
                        h->got.offset |= 1;
                      }
                  }
+               else
+                 unresolved_reloc = FALSE;
              }
            else
              {
@@ -1628,6 +1589,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
          relocation = (splt->output_section->vma
                        + splt->output_offset
                        + h->plt.offset);
+         unresolved_reloc = FALSE;
          break;
 
        case R_68K_PLT8O:
@@ -1644,6 +1606,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
            }
 
          relocation = h->plt.offset;
+         unresolved_reloc = FALSE;
 
          /* This relocation does not use the addend.  */
          rel->r_addend = 0;
@@ -1790,39 +1753,58 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
          break;
        }
 
+      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
+        because such sections are not SEC_ALLOC and thus ld.so will
+        not process them.  */
+      if (unresolved_reloc
+         && !((input_section->flags & SEC_DEBUGGING) != 0
+              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
+       {
+         (*_bfd_error_handler)
+           (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
+            bfd_archive_filename (input_bfd),
+            bfd_get_section_name (input_bfd, input_section),
+            (long) rel->r_offset,
+            h->root.root.string);
+         return FALSE;
+       }
+
       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
                                    contents, rel->r_offset,
                                    relocation, rel->r_addend);
 
       if (r != bfd_reloc_ok)
        {
-         switch (r)
+         const char *name;
+
+         if (h != NULL)
+           name = h->root.root.string;
+         else
            {
-           default:
-           case bfd_reloc_outofrange:
-             abort ();
-           case bfd_reloc_overflow:
-             {
-               const char *name;
+             name = bfd_elf_string_from_elf_section (input_bfd,
+                                                     symtab_hdr->sh_link,
+                                                     sym->st_name);
+             if (name == NULL)
+               return FALSE;
+             if (*name == '\0')
+               name = bfd_section_name (input_bfd, sec);
+           }
 
-               if (h != NULL)
-                 name = h->root.root.string;
-               else
-                 {
-                   name = bfd_elf_string_from_elf_section (input_bfd,
-                                                           symtab_hdr->sh_link,
-                                                           sym->st_name);
-                   if (name == NULL)
-                     return FALSE;
-                   if (*name == '\0')
-                     name = bfd_section_name (input_bfd, sec);
-                 }
-               if (!(info->callbacks->reloc_overflow
-                     (info, name, howto->name, (bfd_vma) 0,
-                      input_bfd, input_section, rel->r_offset)))
-                 return FALSE;
-             }
-             break;
+         if (r == bfd_reloc_overflow)
+           {
+             if (!(info->callbacks->reloc_overflow
+                   (info, name, howto->name, (bfd_vma) 0,
+                    input_bfd, input_section, rel->r_offset)))
+               return FALSE;
+           }
+         else
+           {
+             (*_bfd_error_handler)
+               (_("%s(%s+0x%lx): reloc against `%s': error %d"),
+                bfd_archive_filename (input_bfd),
+                bfd_get_section_name (input_bfd, input_section),
+                (long) rel->r_offset, name, (int) r);
+             return FALSE;
            }
        }
     }
This page took 0.032821 seconds and 4 git commands to generate.