[binutils-gdb] Re: tekhex object file output fixes

Alan Modra amodra@sourceware.org
Tue Nov 12 06:40:59 GMT 2024


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

commit e0323071916878e0634a6e24d8250e4faff67e88
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Nov 11 10:24:09 2024 +1030

    Re: tekhex object file output fixes
    
    Commit 8b5a212495 supported *ABS* symbols by allowing "section" to be
    bfd_abs_section, but bfd_abs_section needs to be treated specially.
    In particular, bfd_get_next_section_by_name (.., bfd_abs_section_ptr)
    is invalid.
    
            PR 32347
            * tekhex.c (first_phase): Guard against modification of
            _bfd_std_section[] entries.

Diff:
---
 bfd/tekhex.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/bfd/tekhex.c b/bfd/tekhex.c
index aea2ebb23df..b305c1f96f1 100644
--- a/bfd/tekhex.c
+++ b/bfd/tekhex.c
@@ -361,6 +361,7 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
 {
   asection *section, *alt_section;
   unsigned int len;
+  bfd_vma addr;
   bfd_vma val;
   char sym[17];			/* A symbol can only be 16chars long.  */
 
@@ -368,20 +369,16 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
     {
     case '6':
       /* Data record - read it and store it.  */
-      {
-	bfd_vma addr;
-
-	if (!getvalue (&src, &addr, src_end))
-	  return false;
-
-	while (*src && src < src_end - 1)
-	  {
-	    insert_byte (abfd, HEX (src), addr);
-	    src += 2;
-	    addr++;
-	  }
-	return true;
-      }
+      if (!getvalue (&src, &addr, src_end))
+	return false;
+
+      while (*src && src < src_end - 1)
+	{
+	  insert_byte (abfd, HEX (src), addr);
+	  src += 2;
+	  addr++;
+	}
+      return true;
 
     case '3':
       /* Symbol record, read the segment.  */
@@ -406,13 +403,16 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
 	    {
 	    case '1':		/* Section range.  */
 	      src++;
-	      if (!getvalue (&src, &section->vma, src_end))
+	      if (!getvalue (&src, &addr, src_end))
 		return false;
 	      if (!getvalue (&src, &val, src_end))
 		return false;
-	      if (val < section->vma)
-		val = section->vma;
-	      section->size = val - section->vma;
+	      if (bfd_is_const_section (section))
+		break;
+	      section->vma = addr;
+	      if (val < addr)
+		val = addr;
+	      section->size = val - addr;
 	      /* PR 17512: file: objdump-s-endless-loop.tekhex.
 		 Check for overlarge section sizes.  */
 	      if (section->size & 0x80000000)
@@ -455,6 +455,8 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
 		  new_symbol->symbol.flags = BSF_LOCAL;
 		if (stype == '2' || stype == '6')
 		  new_symbol->symbol.section = bfd_abs_section_ptr;
+		else if (bfd_is_const_section (section))
+		  ;
 		else if (stype == '3' || stype == '7')
 		  {
 		    if ((section->flags & SEC_DATA) == 0)


More information about the Binutils-cvs mailing list