X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Ftekhex.c;h=0ed7b5032b8283973eecf01049de044ced4a79cf;hb=fd885f3a4d85dc33d794ca359ea91f31e3082717;hp=559f21afb5ccce6f00b6d635060cb45aabadeb30;hpb=01f0fe5e0450edf168c1f612feb93cf588e4e7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/tekhex.c b/bfd/tekhex.c index 559f21afb5..0ed7b5032b 100644 --- a/bfd/tekhex.c +++ b/bfd/tekhex.c @@ -1,13 +1,13 @@ /* BFD backend for Extended Tektronix Hex Format objects. Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, - 2003, 2004 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2009, 2011 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support . This file is part of BFD, the Binary File Descriptor library. 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 - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,7 +17,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + /* SUBSECTION Tektronix Hex Format handling @@ -65,8 +67,8 @@ The data can come out of order, and may be discontigous. This is a serial protocol, so big files are unlikely, so we keep a list of 8k chunks. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "libiberty.h" @@ -264,36 +266,50 @@ typedef struct tekhex_data_struct #define enda(x) (x->vma + x->size) -static bfd_vma -getvalue (char **srcp) +static bfd_boolean +getvalue (char **srcp, bfd_vma *valuep) { char *src = *srcp; bfd_vma value = 0; - unsigned int len = hex_value(*src++); + unsigned int len; + if (!ISHEX (*src)) + return FALSE; + + len = hex_value (*src++); if (len == 0) len = 16; while (len--) - value = value << 4 | hex_value(*src++); + { + if (!ISHEX (*src)) + return FALSE; + value = value << 4 | hex_value (*src++); + } *srcp = src; - return value; + *valuep = value; + return TRUE; } -static unsigned int -getsym (char *dstp, char **srcp) +static bfd_boolean +getsym (char *dstp, char **srcp, unsigned int *lenp) { char *src = *srcp; unsigned int i; - unsigned int len = hex_value(*src++); + unsigned int len; + + if (!ISHEX (*src)) + return FALSE; + len = hex_value (*src++); if (len == 0) len = 16; for (i = 0; i < len; i++) dstp[i] = src[i]; dstp[i] = 0; *srcp = src + i; - return len; + *lenp = len; + return TRUE; } static struct data_struct * @@ -308,7 +324,8 @@ find_chunk (bfd *abfd, bfd_vma vma) if (!d) { /* No chunk for this address, so make one up. */ - d = bfd_zalloc (abfd, (bfd_size_type) sizeof (struct data_struct)); + d = (struct data_struct *) + bfd_zalloc (abfd, (bfd_size_type) sizeof (struct data_struct)); if (!d) return NULL; @@ -333,11 +350,12 @@ insert_byte (bfd *abfd, int value, bfd_vma addr) /* The first pass is to find the names of all the sections, and see how big the data is. */ -static void +static bfd_boolean first_phase (bfd *abfd, int type, char *src) { asection *section = bfd_abs_section_ptr; unsigned int len; + bfd_vma val; char sym[17]; /* A symbol can only be 16chars long. */ switch (type) @@ -345,7 +363,10 @@ first_phase (bfd *abfd, int type, char *src) case '6': /* Data record - read it and store it. */ { - bfd_vma addr = getvalue (&src); + bfd_vma addr; + + if (!getvalue (&src, &addr)) + return FALSE; while (*src) { @@ -355,19 +376,22 @@ first_phase (bfd *abfd, int type, char *src) } } - return; + return TRUE; case '3': /* Symbol record, read the segment. */ - len = getsym (sym, &src); + if (!getsym (sym, &src, &len)) + return FALSE; section = bfd_get_section_by_name (abfd, sym); if (section == NULL) { - char *n = bfd_alloc (abfd, (bfd_size_type) len + 1); + char *n = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1); if (!n) - abort (); /* FIXME. */ + return FALSE; memcpy (n, sym, len + 1); section = bfd_make_section (abfd, n); + if (section == NULL) + return FALSE; } while (*src) { @@ -375,8 +399,11 @@ first_phase (bfd *abfd, int type, char *src) { case '1': /* Section range. */ src++; - section->vma = getvalue (&src); - section->size = getvalue (&src) - section->vma; + if (!getvalue (&src, §ion->vma)) + return FALSE; + if (!getvalue (&src, &val)) + return FALSE; + section->size = val - section->vma; section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC; break; case '0': @@ -389,81 +416,95 @@ first_phase (bfd *abfd, int type, char *src) /* Symbols, add to section. */ { bfd_size_type amt = sizeof (tekhex_symbol_type); - tekhex_symbol_type *new = bfd_alloc (abfd, amt); + tekhex_symbol_type *new_symbol = (tekhex_symbol_type *) + bfd_alloc (abfd, amt); char stype = (*src); - if (!new) - abort (); /* FIXME. */ - new->symbol.the_bfd = abfd; + if (!new_symbol) + return FALSE; + new_symbol->symbol.the_bfd = abfd; src++; abfd->symcount++; abfd->flags |= HAS_SYMS; - new->prev = abfd->tdata.tekhex_data->symbols; - abfd->tdata.tekhex_data->symbols = new; - len = getsym (sym, &src); - new->symbol.name = bfd_alloc (abfd, (bfd_size_type) len + 1); - if (!new->symbol.name) - abort (); /* FIXME. */ - memcpy ((char *) (new->symbol.name), sym, len + 1); - new->symbol.section = section; + new_symbol->prev = abfd->tdata.tekhex_data->symbols; + abfd->tdata.tekhex_data->symbols = new_symbol; + if (!getsym (sym, &src, &len)) + return FALSE; + new_symbol->symbol.name = (const char *) + bfd_alloc (abfd, (bfd_size_type) len + 1); + if (!new_symbol->symbol.name) + return FALSE; + memcpy ((char *) (new_symbol->symbol.name), sym, len + 1); + new_symbol->symbol.section = section; if (stype <= '4') - new->symbol.flags = (BSF_GLOBAL | BSF_EXPORT); + new_symbol->symbol.flags = (BSF_GLOBAL | BSF_EXPORT); else - new->symbol.flags = BSF_LOCAL; - new->symbol.value = getvalue (&src) - section->vma; + new_symbol->symbol.flags = BSF_LOCAL; + if (!getvalue (&src, &val)) + return FALSE; + new_symbol->symbol.value = val - section->vma; + break; } + default: + return FALSE; } } } + + return TRUE; } /* Pass over a tekhex, calling one of the above functions on each record. */ -static void -pass_over (bfd *abfd, void (*func) (bfd *, int, char *)) +static bfd_boolean +pass_over (bfd *abfd, bfd_boolean (*func) (bfd *, int, char *)) { unsigned int chars_on_line; - bfd_boolean eof = FALSE; + bfd_boolean is_eof = FALSE; /* To the front of the file. */ if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - abort (); - while (! eof) + return FALSE; + while (! is_eof) { - char buffer[MAXCHUNK]; - char *src = buffer; + char src[MAXCHUNK]; char type; /* Find first '%'. */ - eof = (bfd_boolean) (bfd_bread (src, (bfd_size_type) 1, abfd) != 1); - while (*src != '%' && !eof) - eof = (bfd_boolean) (bfd_bread (src, (bfd_size_type) 1, abfd) != 1); + is_eof = (bfd_boolean) (bfd_bread (src, (bfd_size_type) 1, abfd) != 1); + while (*src != '%' && !is_eof) + is_eof = (bfd_boolean) (bfd_bread (src, (bfd_size_type) 1, abfd) != 1); - if (eof) + if (is_eof) break; - src++; /* Fetch the type and the length and the checksum. */ if (bfd_bread (src, (bfd_size_type) 5, abfd) != 5) - abort (); /* FIXME. */ + return FALSE; type = src[2]; if (!ISHEX (src[0]) || !ISHEX (src[1])) break; - /* Already read five char. */ + /* Already read five chars. */ chars_on_line = HEX (src) - 5; + if (chars_on_line >= MAXCHUNK) + return FALSE; + if (bfd_bread (src, (bfd_size_type) chars_on_line, abfd) != chars_on_line) - abort (); /* FIXME. */ + return FALSE; /* Put a null at the end. */ src[chars_on_line] = 0; - func (abfd, type, src); + if (!func (abfd, type, src)) + return FALSE; } + + return TRUE; } static long @@ -494,7 +535,7 @@ tekhex_mkobject (bfd *abfd) { tdata_type *tdata; - tdata = bfd_alloc (abfd, (bfd_size_type) sizeof (tdata_type)); + tdata = (tdata_type *) bfd_alloc (abfd, (bfd_size_type) sizeof (tdata_type)); if (!tdata) return FALSE; abfd->tdata.tekhex_data = tdata; @@ -524,7 +565,9 @@ tekhex_object_p (bfd *abfd) tekhex_mkobject (abfd); - pass_over (abfd, first_phase); + if (!pass_over (abfd, first_phase)) + return NULL; + return abfd->xvec; } @@ -717,7 +760,6 @@ out (bfd *abfd, int type, char *start, char *end) static bfd_boolean tekhex_write_object_contents (bfd *abfd) { - int bytes_written; char buffer[100]; asymbol **p; asection *s; @@ -725,8 +767,6 @@ tekhex_write_object_contents (bfd *abfd) tekhex_init (); - bytes_written = 0; - /* And the raw data. */ for (d = abfd->tdata.tekhex_data->data; d != NULL; @@ -834,7 +874,7 @@ tekhex_write_object_contents (bfd *abfd) static int tekhex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, - bfd_boolean exec ATTRIBUTE_UNUSED) + struct bfd_link_info *info ATTRIBUTE_UNUSED) { return 0; } @@ -843,13 +883,14 @@ static asymbol * tekhex_make_empty_symbol (bfd *abfd) { bfd_size_type amt = sizeof (struct tekhex_symbol_struct); - tekhex_symbol_type *new = bfd_zalloc (abfd, amt); + tekhex_symbol_type *new_symbol = (tekhex_symbol_type *) bfd_zalloc (abfd, + amt); - if (!new) + if (!new_symbol) return NULL; - new->symbol.the_bfd = abfd; - new->prev = NULL; - return &(new->symbol); + new_symbol->symbol.the_bfd = abfd; + new_symbol->prev = NULL; + return &(new_symbol->symbol); } static void @@ -902,14 +943,18 @@ tekhex_print_symbol (bfd *abfd, #define tekhex_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents #define tekhex_bfd_relax_section bfd_generic_relax_section #define tekhex_bfd_gc_sections bfd_generic_gc_sections +#define tekhex_bfd_lookup_section_flags bfd_generic_lookup_section_flags #define tekhex_bfd_merge_sections bfd_generic_merge_sections #define tekhex_bfd_is_group_section bfd_generic_is_group_section #define tekhex_bfd_discard_group bfd_generic_discard_group #define tekhex_section_already_linked _bfd_generic_section_already_linked +#define tekhex_bfd_define_common_symbol bfd_generic_define_common_symbol #define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define tekhex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols #define tekhex_bfd_link_just_syms _bfd_generic_link_just_syms +#define tekhex_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define tekhex_bfd_final_link _bfd_generic_final_link #define tekhex_bfd_link_split_section _bfd_generic_link_split_section #define tekhex_get_section_contents_in_window _bfd_generic_get_section_contents_in_window @@ -928,6 +973,7 @@ const bfd_target tekhex_vec = 0, /* Leading underscore. */ ' ', /* AR_pad_char. */ 16, /* AR_max_namelen. */ + 0, /* match priority. */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */