Fix test for records crossing a 64K boundary

This commit is contained in:
Nick Clifton
2002-04-16 10:18:14 +00:00
parent ea91f8bb52
commit 3d8dbe36e2
2 changed files with 23 additions and 21 deletions

View File

@ -1,3 +1,8 @@
2002-04-16 Nick Clifton <nickc@cambridge.redhat.com>
* ihex.c (ihex_write_object_contents): Fix check for records
crossing 64K boundaries.
2002-04-16 Alan Modra <amodra@bigpond.net.au> 2002-04-16 Alan Modra <amodra@bigpond.net.au>
* elf32-m32r.c (m32r_elf_add_symbol_hook): Check the hash table * elf32-m32r.c (m32r_elf_add_symbol_hook): Check the hash table

View File

@ -3,21 +3,21 @@
Free Software Foundation, Inc. Free Software Foundation, Inc.
Written by Ian Lance Taylor of Cygnus Support <ian@cygnus.com>. Written by Ian Lance Taylor of Cygnus Support <ian@cygnus.com>.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* This is what Intel Hex files look like: /* This is what Intel Hex files look like:
@ -147,12 +147,12 @@ static int ihex_sizeof_headers PARAMS ((bfd *, boolean));
#define CHUNK 16 #define CHUNK 16
/* Macros for converting between hex and binary. */ /* Macros for converting between hex and binary. */
#define NIBBLE(x) (hex_value (x)) #define NIBBLE(x) (hex_value (x))
#define HEX2(buffer) ((NIBBLE ((buffer)[0]) << 4) + NIBBLE ((buffer)[1])) #define HEX2(buffer) ((NIBBLE ((buffer)[0]) << 4) + NIBBLE ((buffer)[1]))
#define HEX4(buffer) ((HEX2 (buffer) << 8) + HEX2 ((buffer) + 2)) #define HEX4(buffer) ((HEX2 (buffer) << 8) + HEX2 ((buffer) + 2))
#define ISHEX(x) (hex_p (x)) #define ISHEX(x) (hex_p (x))
/* When we write out an ihex value, the values can not be output as /* When we write out an ihex value, the values can not be output as
they are seen. Instead, we hold them in memory in this structure. */ they are seen. Instead, we hold them in memory in this structure. */
@ -288,6 +288,7 @@ ihex_scan (abfd)
lineno = 1; lineno = 1;
error = false; error = false;
bufsize = 0; bufsize = 0;
while ((c = ihex_get_byte (abfd, &error)) != EOF) while ((c = ihex_get_byte (abfd, &error)) != EOF)
{ {
if (c == '\r') if (c == '\r')
@ -314,11 +315,9 @@ ihex_scan (abfd)
unsigned int chksum; unsigned int chksum;
/* This is a data record. */ /* This is a data record. */
pos = bfd_tell (abfd) - 1; pos = bfd_tell (abfd) - 1;
/* Read the header bytes. */ /* Read the header bytes. */
if (bfd_bread (hdr, (bfd_size_type) 8, abfd) != 8) if (bfd_bread (hdr, (bfd_size_type) 8, abfd) != 8)
goto error_return; goto error_return;
@ -336,7 +335,6 @@ ihex_scan (abfd)
type = HEX2 (hdr + 6); type = HEX2 (hdr + 6);
/* Read the data bytes. */ /* Read the data bytes. */
chars = len * 2 + 2; chars = len * 2 + 2;
if (chars >= bufsize) if (chars >= bufsize)
{ {
@ -553,7 +551,6 @@ ihex_object_p (abfd)
} }
/* OK, it looks like it really is an Intel Hex file. */ /* OK, it looks like it really is an Intel Hex file. */
if (! ihex_mkobject (abfd) if (! ihex_mkobject (abfd)
|| ! ihex_scan (abfd)) || ! ihex_scan (abfd))
return NULL; return NULL;
@ -875,8 +872,8 @@ ihex_write_object_contents (abfd)
rec_addr = where - (extbase + segbase); rec_addr = where - (extbase + segbase);
/* Output records shouldn't cross 64K boundaries. */ /* Output records shouldn't cross 64K boundaries. */
if (rec_addr + now > 0xfffff) if (rec_addr + now > 0xffff)
now = 0xffff - rec_addr; now = 0x10000 - rec_addr;
if (! ihex_write_record (abfd, now, rec_addr, 0, p)) if (! ihex_write_record (abfd, now, rec_addr, 0, p))
return false; return false;