bfd/
authorAlan Modra <amodra@gmail.com>
Wed, 16 Feb 2005 02:20:13 +0000 (02:20 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 16 Feb 2005 02:20:13 +0000 (02:20 +0000)
* elf64-ppc.c (ppc64_elf_edit_toc): Skip toc if size is zero.
Skip toc reloc adjust if reloc_count is zero.
ld/
* emultempl/ppc64elf.em (ppc_create_output_section_statements): Make
an error creating fake bfd fatal.
(ppc_before_allocation): Continue on after errors.
(gld${EMULATION_NAME}_finish): Likewise.

bfd/ChangeLog
bfd/elf64-ppc.c
ld/ChangeLog
ld/emultempl/ppc64elf.em

index 120fb5b..21dd79f 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-16  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (ppc64_elf_edit_toc): Skip toc if size is zero.
+       Skip toc reloc adjust if reloc_count is zero.
+
 2005-02-15  Nigel Stephens  <nigel@mips.com>
             Maciej W. Rozycki  <macro@mips.com>
 
index 86419b9..891e032 100644 (file)
@@ -6782,13 +6782,14 @@ ppc64_elf_edit_toc (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
       Elf_Internal_Shdr *symtab_hdr;
       Elf_Internal_Sym *local_syms;
       struct elf_link_hash_entry **sym_hashes;
-      Elf_Internal_Rela *relstart, *rel, *wrel;
+      Elf_Internal_Rela *relstart, *rel;
       unsigned long *skip, *drop;
       unsigned char *used;
       unsigned char *keep, last, some_unused;
 
       toc = bfd_get_section_by_name (ibfd, ".toc");
       if (toc == NULL
+         || toc->size == 0
          || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
          || elf_discarded_section (toc))
        continue;
@@ -7033,25 +7034,32 @@ ppc64_elf_edit_toc (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
          toc->rawsize = toc->size;
          toc->size = src - contents - off;
 
-         /* Read toc relocs.  */
-         relstart = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL, TRUE);
-         if (relstart == NULL)
-           goto error_ret;
+         if (toc->reloc_count != 0)
+           {
+             Elf_Internal_Rela *wrel;
+             bfd_size_type sz;
 
-         /* Remove unused toc relocs, and adjust those we keep.  */
-         wrel = relstart;
-         for (rel = relstart; rel < relstart + toc->reloc_count; ++rel)
-           if (skip[rel->r_offset >> 3] != (unsigned long) -1)
-             {
-               wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
-               wrel->r_info = rel->r_info;
-               wrel->r_addend = rel->r_addend;
-               ++wrel;
-             }
-         toc->reloc_count = wrel - relstart;
-         elf_section_data (toc)->rel_hdr.sh_size
-           = toc->reloc_count * elf_section_data (toc)->rel_hdr.sh_entsize;
-         BFD_ASSERT (elf_section_data (toc)->rel_hdr2 == NULL);
+             /* Read toc relocs.  */
+             relstart = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
+                                                   TRUE);
+             if (relstart == NULL)
+               goto error_ret;
+
+             /* Remove unused toc relocs, and adjust those we keep.  */
+             wrel = relstart;
+             for (rel = relstart; rel < relstart + toc->reloc_count; ++rel)
+               if (skip[rel->r_offset >> 3] != (unsigned long) -1)
+                 {
+                   wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
+                   wrel->r_info = rel->r_info;
+                   wrel->r_addend = rel->r_addend;
+                   ++wrel;
+                 }
+             toc->reloc_count = wrel - relstart;
+             sz = elf_section_data (toc)->rel_hdr.sh_entsize;
+             elf_section_data (toc)->rel_hdr.sh_size = toc->reloc_count * sz;
+             BFD_ASSERT (elf_section_data (toc)->rel_hdr2 == NULL);
+           }
 
          /* Adjust addends for relocs against the toc section sym.  */
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
index e84e3d5..97c7d98 100644 (file)
@@ -1,3 +1,10 @@
+2005-02-16  Alan Modra  <amodra@bigpond.net.au>
+
+       * emultempl/ppc64elf.em (ppc_create_output_section_statements): Make
+       an error creating fake bfd fatal.
+       (ppc_before_allocation): Continue on after errors.
+       (gld${EMULATION_NAME}_finish): Likewise.
+
 2005-02-15  Nick Clifton  <nickc@redhat.com>
 
        * ldlex.l (YY_NO_UNPUT): Define so that the yy_unput function is
index de4f02f..22bcf30 100644 (file)
@@ -88,7 +88,7 @@ ppc_create_output_section_statements (void)
                             bfd_get_arch (output_bfd),
                             bfd_get_mach (output_bfd)))
     {
-      einfo ("%X%P: can not create BFD %E\n");
+      einfo ("%F%P: can not create BFD %E\n");
       return;
     }
 
@@ -104,10 +104,7 @@ ppc_before_allocation (void)
     {
       if (!no_opd_opt
          && !ppc64_elf_edit_opd (output_bfd, &link_info, non_overlapping_opd))
-       {
-         einfo ("%X%P: can not edit %s %E\n", "opd");
-         return;
-       }
+       einfo ("%X%P: can not edit %s %E\n", "opd");
 
       if (ppc64_elf_tls_setup (output_bfd, &link_info) && !no_tls_opt)
        {
@@ -117,10 +114,7 @@ ppc_before_allocation (void)
                              &stat_ptr->head, 0, 0, NULL, TRUE);
 
          if (!ppc64_elf_tls_optimize (output_bfd, &link_info))
-           {
-             einfo ("%X%P: TLS problem %E\n");
-             return;
-           }
+           einfo ("%X%P: TLS problem %E\n");
 
          /* We must not cache anything from the preliminary sizing.  */
          elf_tdata (output_bfd)->program_header_size = 0;
@@ -130,10 +124,7 @@ ppc_before_allocation (void)
       if (!no_toc_opt
          && !link_info.relocatable
          && !ppc64_elf_edit_toc (output_bfd, &link_info))
-       {
-         einfo ("%X%P: can not edit %s %E\n", "toc");
-         return;
-       }
+       einfo ("%X%P: can not edit %s %E\n", "toc");
     }
 
   gld${EMULATION_NAME}_before_allocation ();
@@ -343,14 +334,10 @@ gld${EMULATION_NAME}_finish (void)
     {
       int ret = ppc64_elf_setup_section_lists (output_bfd, &link_info,
                                               no_multi_toc);
-      if (ret != 0)
+      if (ret < 0)
+       einfo ("%X%P: can not size stub section: %E\n");
+      else if (ret > 0)
        {
-         if (ret < 0)
-           {
-             einfo ("%X%P: can not size stub section: %E\n");
-             return;
-           }
-
          toc_section = bfd_get_section_by_name (output_bfd, ".got");
          if (toc_section != NULL)
            lang_for_each_statement (build_toc_list);
@@ -365,10 +352,7 @@ gld${EMULATION_NAME}_finish (void)
                                     group_size,
                                     &ppc_add_stub_section,
                                     &ppc_layout_sections_again))
-           {
-             einfo ("%X%P: can not size stub section: %E\n");
-             return;
-           }
+           einfo ("%X%P: can not size stub section: %E\n");
        }
     }