Home | History | Annotate | Line # | Download | only in bfd
ihex.c revision 1.1.1.5
      1 /* BFD back-end for Intel Hex objects.
      2    Copyright (C) 1995-2020 Free Software Foundation, Inc.
      3    Written by Ian Lance Taylor of Cygnus Support <ian (at) cygnus.com>.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20    MA 02110-1301, USA.  */
     21 
     22 
     23 /* This is what Intel Hex files look like:
     24 
     25 1. INTEL FORMATS
     26 
     27 A. Intel 1
     28 
     29    16-bit address-field format, for files 64k bytes in length or less.
     30 
     31    DATA RECORD
     32    Byte 1	Header = colon(:)
     33    2..3		The number of data bytes in hex notation
     34    4..5		High byte of the record load address
     35    6..7		Low byte of the record load address
     36    8..9		Record type, must be "00"
     37    10..x	Data bytes in hex notation:
     38 	x = (number of bytes - 1) * 2 + 11
     39    x+1..x+2	Checksum in hex notation
     40    x+3..x+4	Carriage return, line feed
     41 
     42    END RECORD
     43    Byte 1	Header = colon (:)
     44    2..3		The byte count, must be "00"
     45    4..7		Transfer-address (usually "0000")
     46 		the jump-to address, execution start address
     47    8..9		Record type, must be "01"
     48    10..11	Checksum, in hex notation
     49    12..13	Carriage return, line feed
     50 
     51 B. INTEL 2
     52 
     53    MCS-86 format, using a 20-bit address for files larger than 64K bytes.
     54 
     55    DATA RECORD
     56    Byte 1	Header = colon (:)
     57    2..3		The byte count of this record, hex notation
     58    4..5		High byte of the record load address
     59    6..7		Low byte of the record load address
     60    8..9		Record type, must be "00"
     61    10..x	The data bytes in hex notation:
     62 	x = (number of data bytes - 1) * 2 + 11
     63    x+1..x+2	Checksum in hex notation
     64    x+3..x+4	Carriage return, line feed
     65 
     66    EXTENDED ADDRESS RECORD
     67    Byte 1	Header = colon(:)
     68    2..3		The byte count, must be "02"
     69    4..7		Load address, must be "0000"
     70    8..9		Record type, must be "02"
     71    10..11	High byte of the offset address
     72    12..13	Low byte of the offset address
     73    14..15	Checksum in hex notation
     74    16..17	Carriage return, line feed
     75 
     76    The checksums are the two's complement of the 8-bit sum
     77    without carry of the byte count, offset address, and the
     78    record type.
     79 
     80    START ADDRESS RECORD
     81    Byte 1	Header = colon (:)
     82    2..3		The byte count, must be "04"
     83    4..7		Load address, must be "0000"
     84    8..9		Record type, must be "03"
     85    10..13	8086 CS value
     86    14..17	8086 IP value
     87    18..19	Checksum in hex notation
     88    20..21	Carriage return, line feed
     89 
     90 Another document reports these additional types:
     91 
     92    EXTENDED LINEAR ADDRESS RECORD
     93    Byte 1	Header = colon (:)
     94    2..3		The byte count, must be "02"
     95    4..7		Load address, must be "0000"
     96    8..9		Record type, must be "04"
     97    10..13	Upper 16 bits of address of subsequent records
     98    14..15	Checksum in hex notation
     99    16..17	Carriage return, line feed
    100 
    101    START LINEAR ADDRESS RECORD
    102    Byte 1	Header = colon (:)
    103    2..3		The byte count, must be "02"
    104    4..7		Load address, must be "0000"
    105    8..9		Record type, must be "05"
    106    10..13	Upper 16 bits of start address
    107    14..15	Checksum in hex notation
    108    16..17	Carriage return, line feed
    109 
    110 The MRI compiler uses this, which is a repeat of type 5:
    111 
    112   EXTENDED START RECORD
    113    Byte 1	Header = colon (:)
    114    2..3		The byte count, must be "04"
    115    4..7		Load address, must be "0000"
    116    8..9		Record type, must be "05"
    117    10..13	Upper 16 bits of start address
    118    14..17	Lower 16 bits of start address
    119    18..19	Checksum in hex notation
    120    20..21	Carriage return, line feed.  */
    121 
    122 #include "sysdep.h"
    123 #include "bfd.h"
    124 #include "libbfd.h"
    125 #include "libiberty.h"
    126 #include "safe-ctype.h"
    127 
    128 /* The number of bytes we put on one line during output.  */
    129 
    130 #define CHUNK 16
    131 
    132 /* Macros for converting between hex and binary.  */
    133 
    134 #define NIBBLE(x)    (hex_value (x))
    135 #define HEX2(buffer) ((NIBBLE ((buffer)[0]) << 4) + NIBBLE ((buffer)[1]))
    136 #define HEX4(buffer) ((HEX2 (buffer) << 8) + HEX2 ((buffer) + 2))
    137 #define ISHEX(x)     (hex_p (x))
    138 
    139 /* When we write out an ihex value, the values can not be output as
    140    they are seen.  Instead, we hold them in memory in this structure.  */
    141 
    142 struct ihex_data_list
    143 {
    144   struct ihex_data_list *next;
    145   bfd_byte *data;
    146   bfd_vma where;
    147   bfd_size_type size;
    148 };
    149 
    150 /* The ihex tdata information.  */
    151 
    152 struct ihex_data_struct
    153 {
    154   struct ihex_data_list *head;
    155   struct ihex_data_list *tail;
    156 };
    157 
    158 /* Initialize by filling in the hex conversion array.  */
    159 
    160 static void
    161 ihex_init (void)
    162 {
    163   static bfd_boolean inited;
    164 
    165   if (! inited)
    166     {
    167       inited = TRUE;
    168       hex_init ();
    169     }
    170 }
    171 
    172 /* Create an ihex object.  */
    173 
    174 static bfd_boolean
    175 ihex_mkobject (bfd *abfd)
    176 {
    177   struct ihex_data_struct *tdata;
    178 
    179   tdata = (struct ihex_data_struct *) bfd_alloc (abfd, sizeof (* tdata));
    180   if (tdata == NULL)
    181     return FALSE;
    182 
    183   abfd->tdata.ihex_data = tdata;
    184   tdata->head = NULL;
    185   tdata->tail = NULL;
    186   return TRUE;
    187 }
    188 
    189 /* Read a byte from a BFD.  Set *ERRORPTR if an error occurred.
    190    Return EOF on error or end of file.  */
    191 
    192 static INLINE int
    193 ihex_get_byte (bfd *abfd, bfd_boolean *errorptr)
    194 {
    195   bfd_byte c;
    196 
    197   if (bfd_bread (&c, (bfd_size_type) 1, abfd) != 1)
    198     {
    199       if (bfd_get_error () != bfd_error_file_truncated)
    200 	*errorptr = TRUE;
    201       return EOF;
    202     }
    203 
    204   return (int) (c & 0xff);
    205 }
    206 
    207 /* Report a problem in an Intel Hex file.  */
    208 
    209 static void
    210 ihex_bad_byte (bfd *abfd, unsigned int lineno, int c, bfd_boolean error)
    211 {
    212   if (c == EOF)
    213     {
    214       if (! error)
    215 	bfd_set_error (bfd_error_file_truncated);
    216     }
    217   else
    218     {
    219       char buf[10];
    220 
    221       if (! ISPRINT (c))
    222 	sprintf (buf, "\\%03o", (unsigned int) c & 0xff);
    223       else
    224 	{
    225 	  buf[0] = c;
    226 	  buf[1] = '\0';
    227 	}
    228       _bfd_error_handler
    229 	/* xgettext:c-format */
    230 	(_("%pB:%d: unexpected character `%s' in Intel Hex file"),
    231 	 abfd, lineno, buf);
    232       bfd_set_error (bfd_error_bad_value);
    233     }
    234 }
    235 
    236 /* Read an Intel hex file and turn it into sections.  We create a new
    237    section for each contiguous set of bytes.  */
    238 
    239 static bfd_boolean
    240 ihex_scan (bfd *abfd)
    241 {
    242   bfd_vma segbase;
    243   bfd_vma extbase;
    244   asection *sec;
    245   unsigned int lineno;
    246   bfd_boolean error;
    247   bfd_byte *buf = NULL;
    248   size_t bufsize;
    249   int c;
    250 
    251   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
    252     goto error_return;
    253 
    254   abfd->start_address = 0;
    255 
    256   segbase = 0;
    257   extbase = 0;
    258   sec = NULL;
    259   lineno = 1;
    260   error = FALSE;
    261   bufsize = 0;
    262 
    263   while ((c = ihex_get_byte (abfd, &error)) != EOF)
    264     {
    265       if (c == '\r')
    266 	continue;
    267       else if (c == '\n')
    268 	{
    269 	  ++lineno;
    270 	  continue;
    271 	}
    272       else if (c != ':')
    273 	{
    274 	  ihex_bad_byte (abfd, lineno, c, error);
    275 	  goto error_return;
    276 	}
    277       else
    278 	{
    279 	  file_ptr pos;
    280 	  unsigned char hdr[8];
    281 	  unsigned int i;
    282 	  unsigned int len;
    283 	  bfd_vma addr;
    284 	  unsigned int type;
    285 	  unsigned int chars;
    286 	  unsigned int chksum;
    287 
    288 	  /* This is a data record.  */
    289 	  pos = bfd_tell (abfd) - 1;
    290 
    291 	  /* Read the header bytes.  */
    292 	  if (bfd_bread (hdr, (bfd_size_type) 8, abfd) != 8)
    293 	    goto error_return;
    294 
    295 	  for (i = 0; i < 8; i++)
    296 	    {
    297 	      if (! ISHEX (hdr[i]))
    298 		{
    299 		  ihex_bad_byte (abfd, lineno, hdr[i], error);
    300 		  goto error_return;
    301 		}
    302 	    }
    303 
    304 	  len = HEX2 (hdr);
    305 	  addr = HEX4 (hdr + 2);
    306 	  type = HEX2 (hdr + 6);
    307 
    308 	  /* Read the data bytes.  */
    309 	  chars = len * 2 + 2;
    310 	  if (chars >= bufsize)
    311 	    {
    312 	      buf = (bfd_byte *) bfd_realloc (buf, (bfd_size_type) chars);
    313 	      if (buf == NULL)
    314 		goto error_return;
    315 	      bufsize = chars;
    316 	    }
    317 
    318 	  if (bfd_bread (buf, (bfd_size_type) chars, abfd) != chars)
    319 	    goto error_return;
    320 
    321 	  for (i = 0; i < chars; i++)
    322 	    {
    323 	      if (! ISHEX (buf[i]))
    324 		{
    325 		  ihex_bad_byte (abfd, lineno, buf[i], error);
    326 		  goto error_return;
    327 		}
    328 	    }
    329 
    330 	  /* Check the checksum.  */
    331 	  chksum = len + addr + (addr >> 8) + type;
    332 	  for (i = 0; i < len; i++)
    333 	    chksum += HEX2 (buf + 2 * i);
    334 	  if (((- chksum) & 0xff) != (unsigned int) HEX2 (buf + 2 * i))
    335 	    {
    336 	      _bfd_error_handler
    337 		/* xgettext:c-format */
    338 		(_("%pB:%u: bad checksum in Intel Hex file (expected %u, found %u)"),
    339 		 abfd, lineno,
    340 		 (- chksum) & 0xff, (unsigned int) HEX2 (buf + 2 * i));
    341 	      bfd_set_error (bfd_error_bad_value);
    342 	      goto error_return;
    343 	    }
    344 
    345 	  switch (type)
    346 	    {
    347 	    case 0:
    348 	      /* This is a data record.  */
    349 	      if (sec != NULL
    350 		  && sec->vma + sec->size == extbase + segbase + addr)
    351 		{
    352 		  /* This data goes at the end of the section we are
    353 		     currently building.  */
    354 		  sec->size += len;
    355 		}
    356 	      else if (len > 0)
    357 		{
    358 		  char secbuf[20];
    359 		  char *secname;
    360 		  bfd_size_type amt;
    361 		  flagword flags;
    362 
    363 		  sprintf (secbuf, ".sec%d", bfd_count_sections (abfd) + 1);
    364 		  amt = strlen (secbuf) + 1;
    365 		  secname = (char *) bfd_alloc (abfd, amt);
    366 		  if (secname == NULL)
    367 		    goto error_return;
    368 		  strcpy (secname, secbuf);
    369 		  flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
    370 		  sec = bfd_make_section_with_flags (abfd, secname, flags);
    371 		  if (sec == NULL)
    372 		    goto error_return;
    373 		  sec->vma = extbase + segbase + addr;
    374 		  sec->lma = extbase + segbase + addr;
    375 		  sec->size = len;
    376 		  sec->filepos = pos;
    377 		}
    378 	      break;
    379 
    380 	    case 1:
    381 	      /* An end record.  */
    382 	      if (abfd->start_address == 0)
    383 		abfd->start_address = addr;
    384 	      if (buf != NULL)
    385 		free (buf);
    386 	      return TRUE;
    387 
    388 	    case 2:
    389 	      /* An extended address record.  */
    390 	      if (len != 2)
    391 		{
    392 		  _bfd_error_handler
    393 		    /* xgettext:c-format */
    394 		    (_("%pB:%u: bad extended address record length in Intel Hex file"),
    395 		     abfd, lineno);
    396 		  bfd_set_error (bfd_error_bad_value);
    397 		  goto error_return;
    398 		}
    399 
    400 	      segbase = HEX4 (buf) << 4;
    401 
    402 	      sec = NULL;
    403 
    404 	      break;
    405 
    406 	    case 3:
    407 	      /* An extended start address record.  */
    408 	      if (len != 4)
    409 		{
    410 		  _bfd_error_handler
    411 		    /* xgettext:c-format */
    412 		    (_("%pB:%u: bad extended start address length in Intel Hex file"),
    413 		     abfd, lineno);
    414 		  bfd_set_error (bfd_error_bad_value);
    415 		  goto error_return;
    416 		}
    417 
    418 	      abfd->start_address += (HEX4 (buf) << 4) + HEX4 (buf + 4);
    419 
    420 	      sec = NULL;
    421 
    422 	      break;
    423 
    424 	    case 4:
    425 	      /* An extended linear address record.  */
    426 	      if (len != 2)
    427 		{
    428 		  _bfd_error_handler
    429 		    /* xgettext:c-format */
    430 		    (_("%pB:%u: bad extended linear address record length in Intel Hex file"),
    431 		     abfd, lineno);
    432 		  bfd_set_error (bfd_error_bad_value);
    433 		  goto error_return;
    434 		}
    435 
    436 	      extbase = HEX4 (buf) << 16;
    437 
    438 	      sec = NULL;
    439 
    440 	      break;
    441 
    442 	    case 5:
    443 	      /* An extended linear start address record.  */
    444 	      if (len != 2 && len != 4)
    445 		{
    446 		  _bfd_error_handler
    447 		    /* xgettext:c-format */
    448 		    (_("%pB:%u: bad extended linear start address length in Intel Hex file"),
    449 		     abfd, lineno);
    450 		  bfd_set_error (bfd_error_bad_value);
    451 		  goto error_return;
    452 		}
    453 
    454 	      if (len == 2)
    455 		abfd->start_address += HEX4 (buf) << 16;
    456 	      else
    457 		abfd->start_address = (HEX4 (buf) << 16) + HEX4 (buf + 4);
    458 
    459 	      sec = NULL;
    460 
    461 	      break;
    462 
    463 	    default:
    464 	      _bfd_error_handler
    465 		/* xgettext:c-format */
    466 		(_("%pB:%u: unrecognized ihex type %u in Intel Hex file"),
    467 		 abfd, lineno, type);
    468 	      bfd_set_error (bfd_error_bad_value);
    469 	      goto error_return;
    470 	    }
    471 	}
    472     }
    473 
    474   if (error)
    475     goto error_return;
    476 
    477   if (buf != NULL)
    478     free (buf);
    479 
    480   return TRUE;
    481 
    482  error_return:
    483   if (buf != NULL)
    484     free (buf);
    485   return FALSE;
    486 }
    487 
    488 /* Try to recognize an Intel Hex file.  */
    489 
    490 static const bfd_target *
    491 ihex_object_p (bfd *abfd)
    492 {
    493   void * tdata_save;
    494   bfd_byte b[9];
    495   unsigned int i;
    496   unsigned int type;
    497 
    498   ihex_init ();
    499 
    500   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
    501     return NULL;
    502   if (bfd_bread (b, (bfd_size_type) 9, abfd) != 9)
    503     {
    504       if (bfd_get_error () == bfd_error_file_truncated)
    505 	bfd_set_error (bfd_error_wrong_format);
    506       return NULL;
    507     }
    508 
    509   if (b[0] != ':')
    510     {
    511       bfd_set_error (bfd_error_wrong_format);
    512       return NULL;
    513     }
    514 
    515   for (i = 1; i < 9; i++)
    516     {
    517       if (! ISHEX (b[i]))
    518 	{
    519 	  bfd_set_error (bfd_error_wrong_format);
    520 	  return NULL;
    521 	}
    522     }
    523 
    524   type = HEX2 (b + 7);
    525   if (type > 5)
    526     {
    527       bfd_set_error (bfd_error_wrong_format);
    528       return NULL;
    529     }
    530 
    531   /* OK, it looks like it really is an Intel Hex file.  */
    532   tdata_save = abfd->tdata.any;
    533   if (! ihex_mkobject (abfd) || ! ihex_scan (abfd))
    534     {
    535       if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
    536 	bfd_release (abfd, abfd->tdata.any);
    537       abfd->tdata.any = tdata_save;
    538       return NULL;
    539     }
    540 
    541   return abfd->xvec;
    542 }
    543 
    544 /* Read the contents of a section in an Intel Hex file.  */
    545 
    546 static bfd_boolean
    547 ihex_read_section (bfd *abfd, asection *section, bfd_byte *contents)
    548 {
    549   int c;
    550   bfd_byte *p;
    551   bfd_byte *buf = NULL;
    552   size_t bufsize;
    553   bfd_boolean error;
    554 
    555   if (bfd_seek (abfd, section->filepos, SEEK_SET) != 0)
    556     goto error_return;
    557 
    558   p = contents;
    559   bufsize = 0;
    560   error = FALSE;
    561   while ((c = ihex_get_byte (abfd, &error)) != EOF)
    562     {
    563       unsigned char hdr[8];
    564       unsigned int len;
    565       unsigned int type;
    566       unsigned int i;
    567 
    568       if (c == '\r' || c == '\n')
    569 	continue;
    570 
    571       /* This is called after ihex_scan has succeeded, so we ought to
    572 	 know the exact format.  */
    573       BFD_ASSERT (c == ':');
    574 
    575       if (bfd_bread (hdr, (bfd_size_type) 8, abfd) != 8)
    576 	goto error_return;
    577 
    578       len = HEX2 (hdr);
    579       type = HEX2 (hdr + 6);
    580 
    581       /* We should only see type 0 records here.  */
    582       if (type != 0)
    583 	{
    584 	  _bfd_error_handler
    585 	    (_("%pB: internal error in ihex_read_section"), abfd);
    586 	  bfd_set_error (bfd_error_bad_value);
    587 	  goto error_return;
    588 	}
    589 
    590       if (len * 2 > bufsize)
    591 	{
    592 	  buf = (bfd_byte *) bfd_realloc (buf, (bfd_size_type) len * 2);
    593 	  if (buf == NULL)
    594 	    goto error_return;
    595 	  bufsize = len * 2;
    596 	}
    597 
    598       if (bfd_bread (buf, (bfd_size_type) len * 2, abfd) != len * 2)
    599 	goto error_return;
    600 
    601       for (i = 0; i < len; i++)
    602 	*p++ = HEX2 (buf + 2 * i);
    603       if ((bfd_size_type) (p - contents) >= section->size)
    604 	{
    605 	  /* We've read everything in the section.  */
    606 	  if (buf != NULL)
    607 	    free (buf);
    608 	  return TRUE;
    609 	}
    610 
    611       /* Skip the checksum.  */
    612       if (bfd_bread (buf, (bfd_size_type) 2, abfd) != 2)
    613 	goto error_return;
    614     }
    615 
    616   if ((bfd_size_type) (p - contents) < section->size)
    617     {
    618       _bfd_error_handler
    619 	(_("%pB: bad section length in ihex_read_section"), abfd);
    620       bfd_set_error (bfd_error_bad_value);
    621       goto error_return;
    622     }
    623 
    624   if (buf != NULL)
    625     free (buf);
    626 
    627   return TRUE;
    628 
    629  error_return:
    630   if (buf != NULL)
    631     free (buf);
    632   return FALSE;
    633 }
    634 
    635 /* Get the contents of a section in an Intel Hex file.  */
    636 
    637 static bfd_boolean
    638 ihex_get_section_contents (bfd *abfd,
    639 			   asection *section,
    640 			   void * location,
    641 			   file_ptr offset,
    642 			   bfd_size_type count)
    643 {
    644   if (section->used_by_bfd == NULL)
    645     {
    646       section->used_by_bfd = bfd_alloc (abfd, section->size);
    647       if (section->used_by_bfd == NULL)
    648 	return FALSE;
    649       if (! ihex_read_section (abfd, section,
    650 			       (bfd_byte *) section->used_by_bfd))
    651 	return FALSE;
    652     }
    653 
    654   memcpy (location, (bfd_byte *) section->used_by_bfd + offset,
    655 	  (size_t) count);
    656 
    657   return TRUE;
    658 }
    659 
    660 /* Set the contents of a section in an Intel Hex file.  */
    661 
    662 static bfd_boolean
    663 ihex_set_section_contents (bfd *abfd,
    664 			   asection *section,
    665 			   const void * location,
    666 			   file_ptr offset,
    667 			   bfd_size_type count)
    668 {
    669   struct ihex_data_list *n;
    670   bfd_byte *data;
    671   struct ihex_data_struct *tdata;
    672 
    673   if (count == 0
    674       || (section->flags & SEC_ALLOC) == 0
    675       || (section->flags & SEC_LOAD) == 0)
    676     return TRUE;
    677 
    678   n = (struct ihex_data_list *) bfd_alloc (abfd, sizeof (* n));
    679   if (n == NULL)
    680     return FALSE;
    681 
    682   data = (bfd_byte *) bfd_alloc (abfd, count);
    683   if (data == NULL)
    684     return FALSE;
    685   memcpy (data, location, (size_t) count);
    686 
    687   n->data = data;
    688   n->where = section->lma + offset;
    689   n->size = count;
    690 
    691   /* Sort the records by address.  Optimize for the common case of
    692      adding a record to the end of the list.  */
    693   tdata = abfd->tdata.ihex_data;
    694   if (tdata->tail != NULL
    695       && n->where >= tdata->tail->where)
    696     {
    697       tdata->tail->next = n;
    698       n->next = NULL;
    699       tdata->tail = n;
    700     }
    701   else
    702     {
    703       struct ihex_data_list **pp;
    704 
    705       for (pp = &tdata->head;
    706 	   *pp != NULL && (*pp)->where < n->where;
    707 	   pp = &(*pp)->next)
    708 	;
    709       n->next = *pp;
    710       *pp = n;
    711       if (n->next == NULL)
    712 	tdata->tail = n;
    713     }
    714 
    715   return TRUE;
    716 }
    717 
    718 /* Write a record out to an Intel Hex file.  */
    719 
    720 static bfd_boolean
    721 ihex_write_record (bfd *abfd,
    722 		   size_t count,
    723 		   unsigned int addr,
    724 		   unsigned int type,
    725 		   bfd_byte *data)
    726 {
    727   static const char digs[] = "0123456789ABCDEF";
    728   char buf[9 + CHUNK * 2 + 4];
    729   char *p;
    730   unsigned int chksum;
    731   unsigned int i;
    732   size_t total;
    733 
    734 #define TOHEX(buf, v) \
    735   ((buf)[0] = digs[((v) >> 4) & 0xf], (buf)[1] = digs[(v) & 0xf])
    736 
    737   buf[0] = ':';
    738   TOHEX (buf + 1, count);
    739   TOHEX (buf + 3, (addr >> 8) & 0xff);
    740   TOHEX (buf + 5, addr & 0xff);
    741   TOHEX (buf + 7, type);
    742 
    743   chksum = count + addr + (addr >> 8) + type;
    744 
    745   for (i = 0, p = buf + 9; i < count; i++, p += 2, data++)
    746     {
    747       TOHEX (p, *data);
    748       chksum += *data;
    749     }
    750 
    751   TOHEX (p, (- chksum) & 0xff);
    752   p[2] = '\r';
    753   p[3] = '\n';
    754 
    755   total = 9 + count * 2 + 4;
    756   if (bfd_bwrite (buf, (bfd_size_type) total, abfd) != total)
    757     return FALSE;
    758 
    759   return TRUE;
    760 }
    761 
    762 /* Write out an Intel Hex file.  */
    763 
    764 static bfd_boolean
    765 ihex_write_object_contents (bfd *abfd)
    766 {
    767   bfd_vma segbase;
    768   bfd_vma extbase;
    769   struct ihex_data_list *l;
    770 
    771   segbase = 0;
    772   extbase = 0;
    773   for (l = abfd->tdata.ihex_data->head; l != NULL; l = l->next)
    774     {
    775       bfd_vma where;
    776       bfd_byte *p;
    777       bfd_size_type count;
    778 
    779       where = l->where;
    780 
    781 #ifdef BFD64
    782       /* IHex only supports 32-bit addresses, and we want to check
    783 	 that 64-bit addresses are in range.  This isn't quite as
    784 	 obvious as it may seem, since some targets have 32-bit
    785 	 addresses that are sign extended to 64 bits.  So complain
    786 	 only if addresses overflow both unsigned and signed 32-bit
    787 	 integers.  */
    788       if (where > 0xffffffff
    789 	  && where + 0x80000000 > 0xffffffff)
    790 	{
    791 	  _bfd_error_handler
    792 	    /* xgettext:c-format */
    793 	    (_("%pB 64-bit address %#" PRIx64
    794 	       " out of range for Intel Hex file"),
    795 	     abfd, (uint64_t) where);
    796 	  bfd_set_error (bfd_error_bad_value);
    797 	  return FALSE;
    798 	}
    799       where &= 0xffffffff;
    800 #endif
    801 
    802       p = l->data;
    803       count = l->size;
    804 
    805       while (count > 0)
    806 	{
    807 	  size_t now;
    808 	  unsigned int rec_addr;
    809 
    810 	  now = count;
    811 	  if (count > CHUNK)
    812 	    now = CHUNK;
    813 
    814 	  if (where > segbase + extbase + 0xffff)
    815 	    {
    816 	      bfd_byte addr[2];
    817 
    818 	      /* We need a new base address.  */
    819 	      if (where <= 0xfffff)
    820 		{
    821 		  /* The addresses should be sorted.  */
    822 		  BFD_ASSERT (extbase == 0);
    823 
    824 		  segbase = where & 0xf0000;
    825 		  addr[0] = (bfd_byte)(segbase >> 12) & 0xff;
    826 		  addr[1] = (bfd_byte)(segbase >> 4) & 0xff;
    827 		  if (! ihex_write_record (abfd, 2, 0, 2, addr))
    828 		    return FALSE;
    829 		}
    830 	      else
    831 		{
    832 		  /* The extended address record and the extended
    833 		     linear address record are combined, at least by
    834 		     some readers.  We need an extended linear address
    835 		     record here, so if we've already written out an
    836 		     extended address record, zero it out to avoid
    837 		     confusion.  */
    838 		  if (segbase != 0)
    839 		    {
    840 		      addr[0] = 0;
    841 		      addr[1] = 0;
    842 		      if (! ihex_write_record (abfd, 2, 0, 2, addr))
    843 			return FALSE;
    844 		      segbase = 0;
    845 		    }
    846 
    847 		  extbase = where & 0xffff0000;
    848 		  if (where > extbase + 0xffff)
    849 		    {
    850 		      _bfd_error_handler
    851 			/* xgettext:c-format */
    852 			(_("%pB: address %#" PRIx64
    853 			   " out of range for Intel Hex file"),
    854 			 abfd, (uint64_t) where);
    855 		      bfd_set_error (bfd_error_bad_value);
    856 		      return FALSE;
    857 		    }
    858 		  addr[0] = (bfd_byte)(extbase >> 24) & 0xff;
    859 		  addr[1] = (bfd_byte)(extbase >> 16) & 0xff;
    860 		  if (! ihex_write_record (abfd, 2, 0, 4, addr))
    861 		    return FALSE;
    862 		}
    863 	    }
    864 
    865 	  rec_addr = where - (extbase + segbase);
    866 
    867 	  /* Output records shouldn't cross 64K boundaries.  */
    868 	  if (rec_addr + now > 0xffff)
    869 	    now = 0x10000 - rec_addr;
    870 
    871 	  if (! ihex_write_record (abfd, now, rec_addr, 0, p))
    872 	    return FALSE;
    873 
    874 	  where += now;
    875 	  p += now;
    876 	  count -= now;
    877 	}
    878     }
    879 
    880   if (abfd->start_address != 0)
    881     {
    882       bfd_vma start;
    883       bfd_byte startbuf[4];
    884 
    885       start = abfd->start_address;
    886 
    887       if (start <= 0xfffff)
    888 	{
    889 	  startbuf[0] = (bfd_byte)((start & 0xf0000) >> 12) & 0xff;
    890 	  startbuf[1] = 0;
    891 	  startbuf[2] = (bfd_byte)(start >> 8) & 0xff;
    892 	  startbuf[3] = (bfd_byte)start & 0xff;
    893 	  if (! ihex_write_record (abfd, 4, 0, 3, startbuf))
    894 	    return FALSE;
    895 	}
    896       else
    897 	{
    898 	  startbuf[0] = (bfd_byte)(start >> 24) & 0xff;
    899 	  startbuf[1] = (bfd_byte)(start >> 16) & 0xff;
    900 	  startbuf[2] = (bfd_byte)(start >> 8) & 0xff;
    901 	  startbuf[3] = (bfd_byte)start & 0xff;
    902 	  if (! ihex_write_record (abfd, 4, 0, 5, startbuf))
    903 	    return FALSE;
    904 	}
    905     }
    906 
    907   if (! ihex_write_record (abfd, 0, 0, 1, NULL))
    908     return FALSE;
    909 
    910   return TRUE;
    911 }
    912 
    913 /* Set the architecture for the output file.  The architecture is
    914    irrelevant, so we ignore errors about unknown architectures.  */
    915 
    916 static bfd_boolean
    917 ihex_set_arch_mach (bfd *abfd,
    918 		    enum bfd_architecture arch,
    919 		    unsigned long mach)
    920 {
    921   if (! bfd_default_set_arch_mach (abfd, arch, mach))
    922     {
    923       if (arch != bfd_arch_unknown)
    924 	return FALSE;
    925     }
    926   return TRUE;
    927 }
    928 
    929 /* Get the size of the headers, for the linker.  */
    930 
    931 static int
    932 ihex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
    933 		     struct bfd_link_info *info ATTRIBUTE_UNUSED)
    934 {
    935   return 0;
    936 }
    937 
    938 /* Some random definitions for the target vector.  */
    939 
    940 #define	ihex_close_and_cleanup			  _bfd_generic_close_and_cleanup
    941 #define ihex_bfd_free_cached_info		  _bfd_generic_bfd_free_cached_info
    942 #define ihex_new_section_hook			  _bfd_generic_new_section_hook
    943 #define ihex_get_section_contents_in_window	  _bfd_generic_get_section_contents_in_window
    944 #define ihex_get_symtab_upper_bound		  _bfd_long_bfd_0
    945 #define ihex_canonicalize_symtab		  _bfd_nosymbols_canonicalize_symtab
    946 #define ihex_make_empty_symbol			  _bfd_generic_make_empty_symbol
    947 #define ihex_print_symbol			  _bfd_nosymbols_print_symbol
    948 #define ihex_get_symbol_info			  _bfd_nosymbols_get_symbol_info
    949 #define ihex_get_symbol_version_string		  _bfd_nosymbols_get_symbol_version_string
    950 #define ihex_bfd_is_target_special_symbol	  _bfd_bool_bfd_asymbol_false
    951 #define ihex_bfd_is_local_label_name		  _bfd_nosymbols_bfd_is_local_label_name
    952 #define ihex_get_lineno				  _bfd_nosymbols_get_lineno
    953 #define ihex_find_nearest_line			  _bfd_nosymbols_find_nearest_line
    954 #define ihex_find_line				  _bfd_nosymbols_find_line
    955 #define ihex_find_inliner_info			  _bfd_nosymbols_find_inliner_info
    956 #define ihex_bfd_make_debug_symbol		  _bfd_nosymbols_bfd_make_debug_symbol
    957 #define ihex_read_minisymbols			  _bfd_nosymbols_read_minisymbols
    958 #define ihex_minisymbol_to_symbol		  _bfd_nosymbols_minisymbol_to_symbol
    959 #define ihex_bfd_get_relocated_section_contents	  bfd_generic_get_relocated_section_contents
    960 #define ihex_bfd_relax_section			  bfd_generic_relax_section
    961 #define ihex_bfd_gc_sections			  bfd_generic_gc_sections
    962 #define ihex_bfd_lookup_section_flags		  bfd_generic_lookup_section_flags
    963 #define ihex_bfd_merge_sections			  bfd_generic_merge_sections
    964 #define ihex_bfd_is_group_section		  bfd_generic_is_group_section
    965 #define ihex_bfd_group_name			  bfd_generic_group_name
    966 #define ihex_bfd_discard_group			  bfd_generic_discard_group
    967 #define ihex_section_already_linked		  _bfd_generic_section_already_linked
    968 #define ihex_bfd_define_common_symbol		  bfd_generic_define_common_symbol
    969 #define ihex_bfd_link_hide_symbol		  _bfd_generic_link_hide_symbol
    970 #define ihex_bfd_define_start_stop		  bfd_generic_define_start_stop
    971 #define ihex_bfd_link_hash_table_create		  _bfd_generic_link_hash_table_create
    972 #define ihex_bfd_link_add_symbols		  _bfd_generic_link_add_symbols
    973 #define ihex_bfd_link_just_syms			  _bfd_generic_link_just_syms
    974 #define ihex_bfd_copy_link_hash_symbol_type	  _bfd_generic_copy_link_hash_symbol_type
    975 #define ihex_bfd_final_link			  _bfd_generic_final_link
    976 #define ihex_bfd_link_split_section		  _bfd_generic_link_split_section
    977 #define ihex_bfd_link_check_relocs		  _bfd_generic_link_check_relocs
    978 
    979 /* The Intel Hex target vector.  */
    980 
    981 const bfd_target ihex_vec =
    982 {
    983   "ihex",			/* Name.  */
    984   bfd_target_ihex_flavour,
    985   BFD_ENDIAN_UNKNOWN,		/* Target byte order.  */
    986   BFD_ENDIAN_UNKNOWN,		/* Target headers byte order.  */
    987   0,				/* Object flags.  */
    988   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD),	/* Section flags.  */
    989   0,				/* Leading underscore.  */
    990   ' ',				/* AR_pad_char.  */
    991   16,				/* AR_max_namelen.  */
    992   0,				/* match priority.  */
    993   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
    994   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
    995   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
    996   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
    997   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
    998   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Headers. */
    999 
   1000   {
   1001     _bfd_dummy_target,
   1002     ihex_object_p,		/* bfd_check_format.  */
   1003     _bfd_dummy_target,
   1004     _bfd_dummy_target,
   1005   },
   1006   {
   1007     _bfd_bool_bfd_false_error,
   1008     ihex_mkobject,
   1009     _bfd_generic_mkarchive,
   1010     _bfd_bool_bfd_false_error,
   1011   },
   1012   {				/* bfd_write_contents.  */
   1013     _bfd_bool_bfd_false_error,
   1014     ihex_write_object_contents,
   1015     _bfd_write_archive_contents,
   1016     _bfd_bool_bfd_false_error,
   1017   },
   1018 
   1019   BFD_JUMP_TABLE_GENERIC (ihex),
   1020   BFD_JUMP_TABLE_COPY (_bfd_generic),
   1021   BFD_JUMP_TABLE_CORE (_bfd_nocore),
   1022   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
   1023   BFD_JUMP_TABLE_SYMBOLS (ihex),
   1024   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
   1025   BFD_JUMP_TABLE_WRITE (ihex),
   1026   BFD_JUMP_TABLE_LINK (ihex),
   1027   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
   1028 
   1029   NULL,
   1030 
   1031   NULL
   1032 };
   1033