Obsolete tic30-aout, and linker segmentation faults
authorAlan Modra <amodra@gmail.com>
Mon, 27 May 2019 10:30:11 +0000 (20:00 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 28 May 2019 01:25:21 +0000 (10:55 +0930)
See also the FIXME.  tic30-aout linker support is so bad (and has been
that way since the initial tic30-aout commit) that I'm obsoleting the
target.  This patch fixes numerous linker testsuite segmentation faults.

PR 24596
* aout-tic30.c (MY_bfd_final_link): Don't segfault on missing
create_object_symbols_section, obj_textsec, obj_datasec or
obj_bsssec.  Fix other errors in placement.
* config.bfd: Obsolete tic30-aout.

bfd/ChangeLog
bfd/aout-tic30.c
bfd/config.bfd

index 3460d78..254ebcb 100644 (file)
@@ -1,6 +1,14 @@
 2019-05-28  Alan Modra  <amodra@gmail.com>
 
        PR 24596
+       * aout-tic30.c (MY_bfd_final_link): Don't segfault on missing
+       create_object_symbols_section, obj_textsec, obj_datasec or
+       obj_bsssec.  Fix other errors in placement.
+       * config.bfd: Obsolete tic30-aout.
+
+2019-05-28  Alan Modra  <amodra@gmail.com>
+
+       PR 24596
        * dwarf2.c (save_section_vma, section_vma_same): Check for NULL
        end of section list as well as section_count.
        * xcofflink.c (xcoff_link_add_symbols): Fix temporarily changed
index c872e9b..4946318 100644 (file)
@@ -710,53 +710,87 @@ static bfd_boolean
 MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
 {
   struct internal_exec *execp = exec_hdr (abfd);
+  asection *objsym_section;
   file_ptr pos;
   bfd_vma vma = 0;
-  int pad;
 
   /* Set the executable header size to 0, as we don't want one for an
-     output.  */
+     output.  FIXME: Really?  tic30_aout_object_p doesn't accept such
+     an executable!  */
   adata (abfd).exec_bytes_size = 0;
+
   pos = adata (abfd).exec_bytes_size;
+  /* ??? Why are we looking at create_object_symbols_section?  */
+  objsym_section = info->create_object_symbols_section;
+  if (objsym_section != NULL)
+    vma = objsym_section->vma;
+
   /* Text.  */
-  vma = info->create_object_symbols_section->vma;
-  pos += vma;
-  obj_textsec (abfd)->filepos = pos;
-  obj_textsec (abfd)->vma = vma;
-  obj_textsec (abfd)->user_set_vma = 1;
-  pos += obj_textsec (abfd)->size;
-  vma += obj_textsec (abfd)->size;
+  if (obj_textsec (abfd) != NULL)
+    {
+      pos += vma;
+      obj_textsec (abfd)->filepos = pos;
+      obj_textsec (abfd)->vma = vma;
+      obj_textsec (abfd)->user_set_vma = 1;
+      execp->a_text = obj_textsec (abfd)->size;
+      pos += obj_textsec (abfd)->size;
+      vma += obj_textsec (abfd)->size;
+    }
 
   /* Data.  */
-  if (abfd->flags & D_PAGED)
+  if (obj_datasec (abfd) != NULL)
     {
-      if (info->create_object_symbols_section->next->vma > 0)
-       obj_datasec (abfd)->vma = info->create_object_symbols_section->next->vma;
+      if (abfd->flags & D_PAGED)
+       {
+         if (objsym_section != NULL
+             && objsym_section->next != NULL
+             && objsym_section->next->vma != 0)
+           obj_datasec (abfd)->vma = objsym_section->next->vma;
+         else
+           obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
+       }
       else
-       obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
-    }
-  else
-    obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+       obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
 
-  if (obj_datasec (abfd)->vma < vma)
-    obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+      if (obj_datasec (abfd)->vma < vma)
+       obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
 
-  obj_datasec (abfd)->user_set_vma = 1;
-  vma = obj_datasec (abfd)->vma;
-  obj_datasec (abfd)->filepos = vma + adata (abfd).exec_bytes_size;
-  execp->a_text = vma - obj_textsec (abfd)->vma;
-  obj_textsec (abfd)->size = execp->a_text;
+      pos += obj_datasec (abfd)->vma - vma;
+      obj_datasec (abfd)->filepos = pos;
+      obj_datasec (abfd)->user_set_vma = 1;
+
+      vma = obj_datasec (abfd)->vma;
+      if (obj_textsec (abfd) != NULL)
+       {
+         execp->a_text = vma - obj_textsec (abfd)->vma;
+         obj_textsec (abfd)->size = execp->a_text;
+       }
+      execp->a_data = obj_datasec (abfd)->size;
+      vma += obj_datasec (abfd)->size;
+    }
 
   /* Since BSS follows data immediately, see if it needs alignment.  */
-  vma += obj_datasec (abfd)->size;
-  pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma;
-  obj_datasec (abfd)->size += pad;
-  pos += obj_datasec (abfd)->size;
-  execp->a_data = obj_datasec (abfd)->size;
-
-  /* BSS.  */
-  obj_bsssec (abfd)->vma = vma;
-  obj_bsssec (abfd)->user_set_vma = 1;
+  if (obj_bsssec (abfd) != NULL)
+    {
+      int pad;
+
+      pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma;
+      if (obj_datasec (abfd) != NULL)
+       {
+         obj_datasec (abfd)->size += pad;
+         execp->a_data += pad;
+       }
+      else if (obj_textsec (abfd) != NULL)
+       {
+         obj_textsec (abfd)->size += pad;
+         execp->a_text += pad;
+       }
+
+      /* BSS.  */
+      vma += pad;
+      obj_bsssec (abfd)->vma = vma;
+      obj_bsssec (abfd)->user_set_vma = 1;
+    }
 
   /* We are fully resized, so don't readjust in final_link.  */
   adata (abfd).magic = z_magic;
index 8bc330e..c6b04ea 100644 (file)
@@ -53,6 +53,7 @@ case $targ in
     echo "*** Use or1k-*-elf or or1k-*-linux as the target instead" >&2
     exit 1
     ;;
+ c30-*-*aout* | tic30-*-*aout* | \
  null)
     if test "x$enable_obsolete" != xyes; then
       echo "*** Configuration $targ is obsolete." >&2