Obsolete tic30-aout, and linker segmentation faults

Message ID 20190528012831.GO6820@bubble.grove.modra.org
State New
Headers show
Series
  • Obsolete tic30-aout, and linker segmentation faults
Related show

Commit Message

Alan Modra May 28, 2019, 1:28 a.m.
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.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c
index c872e9b416..49463181f0 100644
--- a/bfd/aout-tic30.c
+++ b/bfd/aout-tic30.c
@@ -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;
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 8bc330e41a..c6b04ea4a5 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -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