X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Ftekhex.c;h=77b471a2d7c8c4c4153ea313fec024339db92257;hb=6990d625c8b0d2597c0c2016b44804df02c638e0;hp=48d7e5cf180bacb65cc6819208b376f2c0b4a7b4;hpb=ae115e5114deb0326333c80f7af9e689b2e7d01f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/tekhex.c b/bfd/tekhex.c index 48d7e5cf18..77b471a2d7 100644 --- a/bfd/tekhex.c +++ b/bfd/tekhex.c @@ -1,6 +1,6 @@ /* BFD backend for Extended Tektronix Hex Format objects. - Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - + Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support . This file is part of BFD, the Binary File Descriptor library. @@ -24,11 +24,11 @@ SUBSECTION Tektronix Hex Format handling DESCRIPTION - + Tek Hex records can hold symbols and data, but not relocations. Their main application is communication with devices like PROM programmers and ICE equipment. - + It seems that the sections are descibed as being really big, the example I have says that the text section is 0..ffffffff. BFD would barf with this, many apps would try to alloc 4GB to @@ -49,11 +49,10 @@ DESCRIPTION Any number of sections may be created for output, we save them up and output them when it's time to close the bfd. - A TekHex record looks like: EXAMPLE % - + DESCRIPTION Where o length @@ -63,7 +62,6 @@ DESCRIPTION 3) symbol record 6) data record 8) termination record - 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 @@ -100,6 +98,35 @@ static char sum_block[256]; (d)[0] = digs[((x)>>4)&0xf]; #define ISHEX(x) hex_p(x) +static void tekhex_init PARAMS ((void)); +static bfd_vma getvalue PARAMS ((char **)); +static void tekhex_print_symbol + PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type)); +static void tekhex_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *)); +static asymbol *tekhex_make_empty_symbol PARAMS ((bfd *)); +static int tekhex_sizeof_headers PARAMS ((bfd *, bfd_boolean)); +static bfd_boolean tekhex_write_object_contents PARAMS ((bfd *)); +static void out PARAMS ((bfd *, int, char *, char *)); +static void writesym PARAMS ((char **, const char *)); +static void writevalue PARAMS ((char **, bfd_vma)); +static bfd_boolean tekhex_set_section_contents + PARAMS ((bfd*, sec_ptr, PTR, file_ptr, bfd_size_type)); +static bfd_boolean tekhex_set_arch_mach + PARAMS ((bfd *, enum bfd_architecture, unsigned long)); +static bfd_boolean tekhex_get_section_contents + PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); +static void move_section_contents + PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type, bfd_boolean)); +static const bfd_target *tekhex_object_p PARAMS ((bfd *)); +static bfd_boolean tekhex_mkobject PARAMS ((bfd *)); +static long tekhex_get_symtab_upper_bound PARAMS ((bfd *)); +static long tekhex_get_symtab PARAMS ((bfd *, asymbol **)); +static void pass_over PARAMS ((bfd *, void (*) (bfd*, int, char *))); +static void first_phase PARAMS ((bfd *, int, char *)); +static void insert_byte PARAMS ((bfd *, int, bfd_vma)); +static struct data_struct *find_chunk PARAMS ((bfd *, bfd_vma)); +static unsigned int getsym PARAMS ((char *, char **)); + /* Here's an example %3A6C6480004E56FFFC4E717063B0AEFFFC6D0652AEFFFC60F24E5E4E75 @@ -187,7 +214,6 @@ fcffffff g T_SEGMENT i$1 00000000 g T_SEGMENT $ 00000010 g T_SEGMENT $ - RELOCATION RECORDS FOR [D00000000]: (none) RELOCATION RECORDS FOR [D00008000]: (none) @@ -213,12 +239,12 @@ static void tekhex_init () { unsigned int i; - static boolean inited = false; + static bfd_boolean inited = FALSE; int val; - if (inited == false) + if (! inited) { - inited = true; + inited = TRUE; hex_init (); val = 0; for (i = 0; i < 10; i++) @@ -314,7 +340,7 @@ getsym (dstp, srcp) return len; } -struct data_struct * +static struct data_struct * find_chunk (abfd, vma) bfd *abfd; bfd_vma vma; @@ -328,20 +354,13 @@ find_chunk (abfd, vma) } if (!d) { - char *sname = bfd_alloc (abfd, 12); - /* No chunk for this address, so make one up */ - d = (struct data_struct *) - bfd_alloc (abfd, sizeof (struct data_struct)); + d = ((struct data_struct *) + bfd_zalloc (abfd, (bfd_size_type) sizeof (struct data_struct))); - if (!sname || !d) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } + if (!d) + return NULL; - memset (d->chunk_init, 0, CHUNK_MASK + 1); - memset (d->chunk_data, 0, CHUNK_MASK + 1); d->next = abfd->tdata.tekhex_data->data; d->vma = vma; abfd->tdata.tekhex_data->data = d; @@ -367,11 +386,11 @@ insert_byte (abfd, value, addr) static void first_phase (abfd, type, src) bfd *abfd; - char type; + int type; char *src; { asection *section = bfd_abs_section_ptr; - int len; + unsigned int len; char sym[17]; /* A symbol can only be 16chars long */ switch (type) @@ -396,13 +415,10 @@ first_phase (abfd, type, src) section = bfd_get_section_by_name (abfd, sym); if (section == (asection *) NULL) { - char *n = bfd_alloc (abfd, len + 1); + char *n = bfd_alloc (abfd, (bfd_size_type) len + 1); if (!n) - { - bfd_set_error (bfd_error_no_memory); - abort(); /* FIXME */ - } + abort (); /* FIXME */ memcpy (n, sym, len + 1); section = bfd_make_section (abfd, n); } @@ -425,16 +441,13 @@ first_phase (abfd, type, src) case '8': /* Symbols, add to section */ { + bfd_size_type amt = sizeof (tekhex_symbol_type); tekhex_symbol_type *new = - (tekhex_symbol_type *) bfd_alloc (abfd, - sizeof (tekhex_symbol_type)); - char type = (*src); + (tekhex_symbol_type *) bfd_alloc (abfd, amt); + char stype = (*src); if (!new) - { - bfd_set_error (bfd_error_no_memory); - abort(); /* FIXME */ - } + abort (); /* FIXME */ new->symbol.the_bfd = abfd; src++; abfd->symcount++; @@ -442,15 +455,12 @@ first_phase (abfd, type, src) new->prev = abfd->tdata.tekhex_data->symbols; abfd->tdata.tekhex_data->symbols = new; len = getsym (sym, &src); - new->symbol.name = bfd_alloc (abfd, len + 1); + new->symbol.name = bfd_alloc (abfd, (bfd_size_type) len + 1); if (!new->symbol.name) - { - bfd_set_error (bfd_error_no_memory); - abort(); /* FIXME */ - } + abort (); /* FIXME */ memcpy ((char *) (new->symbol.name), sym, len + 1); new->symbol.section = section; - if (type <= '4') + if (stype <= '4') new->symbol.flags = (BSF_GLOBAL | BSF_EXPORT); else new->symbol.flags = BSF_LOCAL; @@ -461,38 +471,38 @@ first_phase (abfd, type, src) } } -/* Pass over an tekhex, calling one of the above functions on each +/* Pass over a tekhex, calling one of the above functions on each record. */ static void - pass_over (abfd, func) +pass_over (abfd, func) bfd *abfd; - void (*func) (); + void (*func) PARAMS ((bfd *, int, char *)); { unsigned int chars_on_line; - boolean eof = false; + bfd_boolean eof = FALSE; /* To the front of the file */ if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) abort (); - while (eof == false) + while (! eof) { char buffer[MAXCHUNK]; char *src = buffer; char type; /* Find first '%' */ - eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1); + eof = (bfd_boolean) (bfd_bread (src, (bfd_size_type) 1, abfd) != 1); while (*src != '%' && !eof) { - eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1); + eof = (bfd_boolean) (bfd_bread (src, (bfd_size_type) 1, abfd) != 1); } if (eof) break; src++; /* Fetch the type and the length and the checksum */ - if (bfd_read (src, 1, 5, abfd) != 5) + if (bfd_bread (src, (bfd_size_type) 5, abfd) != 5) abort (); /* FIXME */ type = src[2]; @@ -502,7 +512,7 @@ static void chars_on_line = HEX (src) - 5; /* Already read five char */ - if (bfd_read (src, 1, chars_on_line, abfd) != chars_on_line) + if (bfd_bread (src, (bfd_size_type) chars_on_line, abfd) != chars_on_line) abort (); /* FIXME */ src[chars_on_line] = 0; /* put a null at the end */ @@ -511,11 +521,10 @@ static void } -long +static long tekhex_get_symtab (abfd, table) bfd *abfd; asymbol **table; - { tekhex_symbol_type *p = abfd->tdata.tekhex_data->symbols; unsigned int c = bfd_get_symcount (abfd); @@ -530,7 +539,7 @@ tekhex_get_symtab (abfd, table) return bfd_get_symcount (abfd); } -long +static long tekhex_get_symtab_upper_bound (abfd) bfd *abfd; { @@ -538,27 +547,25 @@ tekhex_get_symtab_upper_bound (abfd) } -static boolean +static bfd_boolean tekhex_mkobject (abfd) bfd *abfd; { - tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type)); + tdata_type *tdata; + tdata = (tdata_type *) bfd_alloc (abfd, (bfd_size_type) sizeof (tdata_type)); if (!tdata) - { - bfd_set_error (bfd_error_no_memory); - return false; - } + return FALSE; abfd->tdata.tekhex_data = tdata; tdata->type = 1; tdata->head = (tekhex_data_list_type *) NULL; tdata->symbols = (struct tekhex_symbol_struct *) NULL; tdata->data = (struct data_struct *) NULL; - return true; + return TRUE; } /* - Return true if the file looks like it's in TekHex format. Just look + Return TRUE if the file looks like it's in TekHex format. Just look for a percent sign and some hex digits */ static const bfd_target * @@ -570,7 +577,7 @@ tekhex_object_p (abfd) tekhex_init (); if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_read (b, 1, 4, abfd) != 4) + || bfd_bread (b, (bfd_size_type) 4, abfd) != 4) return NULL; if (b[0] != '%' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3])) @@ -589,17 +596,18 @@ move_section_contents (abfd, section, locationp, offset, count, get) PTR locationp; file_ptr offset; bfd_size_type count; - boolean get; + bfd_boolean get; { bfd_vma addr; char *location = (char *) locationp; bfd_vma prev_number = 1; /* Nothing can have this as a high bit*/ struct data_struct *d = (struct data_struct *) NULL; + BFD_ASSERT (offset == 0); for (addr = section->vma; count != 0; count--, addr++) { - - bfd_vma chunk_number = addr & ~CHUNK_MASK; /* Get high bits of address */ + /* Get high bits of address. */ + bfd_vma chunk_number = addr & ~(bfd_vma) CHUNK_MASK; bfd_vma low_bits = addr & CHUNK_MASK; if (chunk_number != prev_number) @@ -630,7 +638,8 @@ move_section_contents (abfd, section, locationp, offset, count, get) } } -static boolean + +static bfd_boolean tekhex_get_section_contents (abfd, section, locationp, offset, count) bfd *abfd; asection *section; @@ -640,14 +649,14 @@ tekhex_get_section_contents (abfd, section, locationp, offset, count) { if (section->flags & (SEC_LOAD | SEC_ALLOC)) { - move_section_contents (abfd, section, locationp, offset, count, true); - return true; + move_section_contents (abfd, section, locationp, offset, count, TRUE); + return TRUE; } else - return false; + return FALSE; } -boolean +static bfd_boolean tekhex_set_arch_mach (abfd, arch, machine) bfd *abfd; enum bfd_architecture arch; @@ -659,7 +668,7 @@ tekhex_set_arch_mach (abfd, arch, machine) /* we have to save up all the Tekhexords for a splurge before output, */ -static boolean +static bfd_boolean tekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do) bfd *abfd; sec_ptr section; @@ -668,7 +677,7 @@ tekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do) bfd_size_type bytes_to_do; { - if (abfd->output_has_begun == false) + if (! abfd->output_has_begun) { /* The first time around, allocate enough sections to hold all the chunks */ asection *s = abfd->sections; @@ -678,7 +687,7 @@ tekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do) { if (s->flags & SEC_LOAD) { - for (vma = s->vma & ~CHUNK_MASK; + for (vma = s->vma & ~(bfd_vma) CHUNK_MASK; vma < s->vma + s->_raw_size; vma += CHUNK_MASK) find_chunk (abfd, vma); @@ -688,11 +697,12 @@ tekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do) } if (section->flags & (SEC_LOAD | SEC_ALLOC)) { - move_section_contents (abfd, section, locationp, offset, bytes_to_do, false); - return true; + move_section_contents (abfd, section, locationp, offset, bytes_to_do, + FALSE); + return TRUE; } else - return false; + return FALSE; } @@ -729,7 +739,7 @@ writevalue (dst, value) static void writesym (dst, sym) char **dst; - CONST char *sym; + const char *sym; { char *p = *dst; int len = (sym ? strlen (sym) : 0); @@ -764,7 +774,7 @@ writesym (dst, sym) static void out (abfd, type, start, end) bfd *abfd; - char type; + int type; char *start; char *end; { @@ -786,15 +796,15 @@ out (abfd, type, start, end) sum += sum_block[(unsigned char) front[2]]; sum += sum_block[(unsigned char) front[3]]; /* type */ TOHEX (front + 4, sum); - if (bfd_write (front, 1, 6, abfd) != 6) + if (bfd_bwrite (front, (bfd_size_type) 6, abfd) != 6) abort (); end[0] = '\n'; wrlen = end - start + 1; - if (bfd_write (start, 1, wrlen, abfd) != wrlen) + if (bfd_bwrite (start, wrlen, abfd) != wrlen) abort (); } -static boolean +static bfd_boolean tekhex_write_object_contents (abfd) bfd *abfd; { @@ -804,6 +814,8 @@ tekhex_write_object_contents (abfd) asection *s; struct data_struct *d; + tekhex_init (); + bytes_written = 0; /* And the raw data */ @@ -813,7 +825,7 @@ tekhex_write_object_contents (abfd) { int low; - CONST int span = 32; + const int span = 32; int addr; /* Write it in blocks of 32 bytes */ @@ -855,63 +867,66 @@ tekhex_write_object_contents (abfd) } /* And the symbols */ - for (p = abfd->outsymbols; *p; p++) + if (abfd->outsymbols) { - int section_code = bfd_decode_symclass (*p); + for (p = abfd->outsymbols; *p; p++) + { + int section_code = bfd_decode_symclass (*p); - if (section_code != '?') - { /* do not include debug symbols */ - asymbol *s = *p; - char *dst = buffer; + if (section_code != '?') + { /* do not include debug symbols */ + asymbol *sym = *p; + char *dst = buffer; - writesym (&dst, s->section->name); + writesym (&dst, sym->section->name); - switch (section_code) - { - case 'A': - *dst++ = '2'; - break; - case 'a': - *dst++ = '6'; - break; - case 'D': - case 'B': - case 'O': - *dst++ = '4'; - break; - case 'd': - case 'b': - case 'o': - *dst++ = '8'; - break; - case 'T': - *dst++ = '3'; - break; - case 't': - *dst++ = '7'; - break; - case 'C': - case 'U': - bfd_set_error (bfd_error_wrong_format); - return false; - } + switch (section_code) + { + case 'A': + *dst++ = '2'; + break; + case 'a': + *dst++ = '6'; + break; + case 'D': + case 'B': + case 'O': + *dst++ = '4'; + break; + case 'd': + case 'b': + case 'o': + *dst++ = '8'; + break; + case 'T': + *dst++ = '3'; + break; + case 't': + *dst++ = '7'; + break; + case 'C': + case 'U': + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } - writesym (&dst, s->name); - writevalue (&dst, s->value + s->section->vma); - out (abfd, '3', buffer, dst); + writesym (&dst, sym->name); + writevalue (&dst, sym->value + sym->section->vma); + out (abfd, '3', buffer, dst); + } } } /* And the terminator */ - if (bfd_write ("%0781010\n", 1, 9, abfd) != 9) + if (bfd_bwrite ("%0781010\n", (bfd_size_type) 9, abfd) != 9) abort (); - return true; + return TRUE; } static int - tekhex_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; +tekhex_sizeof_headers (abfd, exec) + bfd *abfd ATTRIBUTE_UNUSED; + bfd_boolean exec ATTRIBUTE_UNUSED; { return 0; @@ -921,14 +936,11 @@ static asymbol * tekhex_make_empty_symbol (abfd) bfd *abfd; { - tekhex_symbol_type *new = - (tekhex_symbol_type *) bfd_zalloc (abfd, sizeof (struct tekhex_symbol_struct)); + bfd_size_type amt = sizeof (struct tekhex_symbol_struct); + tekhex_symbol_type *new = (tekhex_symbol_type *) bfd_zalloc (abfd, amt); if (!new) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } + return NULL; new->symbol.the_bfd = abfd; new->prev = (struct tekhex_symbol_struct *) NULL; return &(new->symbol); @@ -936,7 +948,7 @@ tekhex_make_empty_symbol (abfd) static void tekhex_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; + bfd *ignore_abfd ATTRIBUTE_UNUSED; asymbol *symbol; symbol_info *ret; { @@ -944,8 +956,8 @@ tekhex_get_symbol_info (ignore_abfd, symbol, ret) } static void -tekhex_print_symbol (ignore_abfd, filep, symbol, how) - bfd *ignore_abfd; +tekhex_print_symbol (abfd, filep, symbol, how) + bfd *abfd; PTR filep; asymbol *symbol; bfd_print_symbol_type how; @@ -962,9 +974,9 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how) case bfd_print_symbol_all: { - CONST char *section_name = symbol->section->name; + const char *section_name = symbol->section->name; - bfd_print_symbol_vandf ((PTR) file, symbol); + bfd_print_symbol_vandf (abfd, (PTR) file, symbol); fprintf (file, " %-5s %s", section_name, @@ -977,7 +989,7 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how) #define tekhex_bfd_free_cached_info _bfd_generic_bfd_free_cached_info #define tekhex_new_section_hook _bfd_generic_new_section_hook -#define tekhex_bfd_is_local_label bfd_generic_is_local_label +#define tekhex_bfd_is_local_label_name bfd_generic_is_local_label_name #define tekhex_get_lineno _bfd_nosymbols_get_lineno #define tekhex_find_nearest_line _bfd_nosymbols_find_nearest_line #define tekhex_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol @@ -987,17 +999,25 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how) #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_merge_sections bfd_generic_merge_sections +#define tekhex_bfd_discard_group bfd_generic_discard_group #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_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 + const bfd_target tekhex_vec = { "tekhex", /* name */ bfd_target_tekhex_flavour, - true, /* target byte order */ - true, /* target headers byte order */ + BFD_ENDIAN_UNKNOWN, /* target byte order */ + BFD_ENDIAN_UNKNOWN, /* target headers byte order */ (EXEC_P | /* object flags */ HAS_SYMS | HAS_LINENO | HAS_DEBUG | HAS_RELOC | HAS_LOCALS | WP_TEXT | D_PAGED), @@ -1006,7 +1026,6 @@ const bfd_target tekhex_vec = 0, /* leading underscore */ ' ', /* ar_pad_char */ 16, /* ar_max_namelen */ - 1, /* minimum alignment */ 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 */ @@ -1043,5 +1062,7 @@ const bfd_target tekhex_vec = BFD_JUMP_TABLE_LINK (tekhex), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), + NULL, + (PTR) 0 };