This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Obsolete tic30-aout, and linker segmentation faults


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a7b34aba62ce347b4e64ca197a5c8b997e3b72df

commit a7b34aba62ce347b4e64ca197a5c8b997e3b72df
Author: Alan Modra <amodra@gmail.com>
Date:   Mon May 27 20:00:11 2019 +0930

    Obsolete tic30-aout, and linker segmentation faults
    
    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.

Diff:
---
 bfd/ChangeLog    |  8 +++++
 bfd/aout-tic30.c | 98 ++++++++++++++++++++++++++++++++++++++------------------
 bfd/config.bfd   |  1 +
 3 files changed, 75 insertions(+), 32 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3460d78..254ebcb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c
index c872e9b..4946318 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 8bc330e..c6b04ea 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]