[binutils-gdb] tekhex object file output fixes

Alan Modra amodra@sourceware.org
Thu Oct 24 07:34:14 GMT 2024


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

commit 8b5a212495371fbc9bea7f4ce6d632df3763723b
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Oct 24 17:48:34 2024 +1030

    tekhex object file output fixes
    
    writevalue didn't handle 64-bit values, dropping the high 32 bits,
    and also wrote any value in the range [0,15] as 0.
    
            * tekhex.c (first_phase): Handle *ABS* symbols.
            (writevalue): Rewrite.

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

diff --git a/bfd/tekhex.c b/bfd/tekhex.c
index 96022c585ab..16e8e185572 100644
--- a/bfd/tekhex.c
+++ b/bfd/tekhex.c
@@ -395,7 +395,7 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
 	  if (!n)
 	    return false;
 	  memcpy (n, sym, len + 1);
-	  section = bfd_make_section (abfd, n);
+	  section = bfd_make_section_old_way (abfd, n);
 	  if (section == NULL)
 	    return false;
 	}
@@ -719,24 +719,13 @@ writevalue (char **dst, bfd_vma value)
   int len;
   int shift;
 
-  for (len = 8, shift = 28; shift; shift -= 4, len--)
-    {
-      if ((value >> shift) & 0xf)
-	{
-	  *p++ = len + '0';
-	  while (len)
-	    {
-	      *p++ = digs[(value >> shift) & 0xf];
-	      shift -= 4;
-	      len--;
-	    }
-	  *dst = p;
-	  return;
+  for (len = BFD_ARCH_SIZE / 4, shift = len * 4 - 4; len > 1; shift -= 4, len--)
+    if ((value >> shift) & 0xf)
+      break;
 
-	}
-    }
-  *p++ = '1';
-  *p++ = '0';
+  *p++ = digs[len & 0xf];
+  for (; len; shift -= 4, len--)
+    *p++ = digs[(value >> shift) & 0xf];
   *dst = p;
 }


More information about the Binutils-cvs mailing list