tekhex.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,066 行 · 第 1/2 页
C
1,066 行
unsigned int c = bfd_get_symcount (abfd); table[c] = 0; while (p) { table[--c] = &(p->symbol); p = p->prev; } return bfd_get_symcount (abfd);}static longtekhex_get_symtab_upper_bound (abfd) bfd *abfd;{ return (abfd->symcount + 1) * (sizeof (struct tekhex_asymbol_struct *));}static booleantekhex_mkobject (abfd) bfd *abfd;{ tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type)); if (!tdata) 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 if the file looks like it's in TekHex format. Just look for a percent sign and some hex digits */static const bfd_target *tekhex_object_p (abfd) bfd *abfd;{ char b[4]; tekhex_init (); if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 || bfd_read (b, 1, 4, abfd) != 4) return NULL; if (b[0] != '%' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3])) return (const bfd_target *) NULL; tekhex_mkobject (abfd); pass_over (abfd, first_phase); return abfd->xvec;}static voidmove_section_contents (abfd, section, locationp, offset, count, get) bfd *abfd; asection *section; PTR locationp; file_ptr offset ATTRIBUTE_UNUSED; bfd_size_type count; 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; for (addr = section->vma; count != 0; count--, addr++) { bfd_vma chunk_number = addr & ~CHUNK_MASK; /* Get high bits of address */ bfd_vma low_bits = addr & CHUNK_MASK; if (chunk_number != prev_number) { /* Different chunk, so move pointer */ d = find_chunk (abfd, chunk_number); } if (get) { if (d->chunk_init[low_bits]) { *location = d->chunk_data[low_bits]; } else { *location = 0; } } else { d->chunk_data[low_bits] = *location; d->chunk_init[low_bits] = (*location != 0); } location++; }}static booleantekhex_get_section_contents (abfd, section, locationp, offset, count) bfd *abfd; asection *section; PTR locationp; file_ptr offset; bfd_size_type count;{ if (section->flags & (SEC_LOAD | SEC_ALLOC)) { move_section_contents (abfd, section, locationp, offset, count, true); return true; } else return false;}static booleantekhex_set_arch_mach (abfd, arch, machine) bfd *abfd; enum bfd_architecture arch; unsigned long machine;{ return bfd_default_set_arch_mach (abfd, arch, machine);}/* we have to save up all the Tekhexords for a splurge before output, */static booleantekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do) bfd *abfd; sec_ptr section; PTR locationp; file_ptr offset; bfd_size_type bytes_to_do;{ if (abfd->output_has_begun == false) { /* The first time around, allocate enough sections to hold all the chunks */ asection *s = abfd->sections; bfd_vma vma; for (s = abfd->sections; s; s = s->next) { if (s->flags & SEC_LOAD) { for (vma = s->vma & ~CHUNK_MASK; vma < s->vma + s->_raw_size; vma += CHUNK_MASK) find_chunk (abfd, vma); } } } if (section->flags & (SEC_LOAD | SEC_ALLOC)) { move_section_contents (abfd, section, locationp, offset, bytes_to_do, false); return true; } else return false;}static voidwritevalue (dst, value) char **dst; bfd_vma value;{ char *p = *dst; 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; } } *p++ = '1'; *p++ = '0'; *dst = p;}static voidwritesym (dst, sym) char **dst; CONST char *sym;{ char *p = *dst; int len = (sym ? strlen (sym) : 0); if (len >= 16) { *p++ = '0'; len = 16; } else { if (len == 0) { *p++ = '1'; sym = "$"; len = 1; } else { *p++ = digs[len]; } } while (len--) { *p++ = *sym++; } *dst = p;}static voidout (abfd, type, start, end) bfd *abfd; int type; char *start; char *end;{ int sum = 0; char *s; char front[6]; bfd_size_type wrlen; front[0] = '%'; TOHEX (front + 1, end - start + 5); front[3] = type; for (s = start; s < end; s++) { sum += sum_block[(unsigned char) *s]; } sum += sum_block[(unsigned char) front[1]]; /* length */ 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) abort (); end[0] = '\n'; wrlen = end - start + 1; if (bfd_write (start, 1, wrlen, abfd) != wrlen) abort ();}static booleantekhex_write_object_contents (abfd) bfd *abfd;{ int bytes_written; char buffer[100]; asymbol **p; asection *s; struct data_struct *d; tekhex_init (); bytes_written = 0; /* And the raw data */ for (d = abfd->tdata.tekhex_data->data; d != (struct data_struct *) NULL; d = d->next) { int low; CONST int span = 32; int addr; /* Write it in blocks of 32 bytes */ for (addr = 0; addr < CHUNK_MASK + 1; addr += span) { int need = 0; /* Check to see if necessary */ for (low = 0; !need && low < span; low++) { if (d->chunk_init[addr + low]) need = 1; } if (need) { char *dst = buffer; writevalue (&dst, addr + d->vma); for (low = 0; low < span; low++) { TOHEX (dst, d->chunk_data[addr + low]); dst += 2; } out (abfd, '6', buffer, dst); } } } /* write all the section headers for the sections */ for (s = abfd->sections; s != (asection *) NULL; s = s->next) { char *dst = buffer; writesym (&dst, s->name); *dst++ = '1'; writevalue (&dst, s->vma); writevalue (&dst, s->vma + s->_raw_size); out (abfd, '3', buffer, dst); } /* And the symbols */ if (abfd->outsymbols) { 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; writesym (&dst, s->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; } writesym (&dst, s->name); writevalue (&dst, s->value + s->section->vma); out (abfd, '3', buffer, dst); } } } /* And the terminator */ if (bfd_write ("%0781010\n", 1, 9, abfd) != 9) abort (); return true;}static inttekhex_sizeof_headers (abfd, exec) bfd *abfd ATTRIBUTE_UNUSED; boolean exec ATTRIBUTE_UNUSED;{ return 0;}static asymbol *tekhex_make_empty_symbol (abfd) bfd *abfd;{ tekhex_symbol_type *new = (tekhex_symbol_type *) bfd_zalloc (abfd, sizeof (struct tekhex_symbol_struct)); if (!new) return NULL; new->symbol.the_bfd = abfd; new->prev = (struct tekhex_symbol_struct *) NULL; return &(new->symbol);}static voidtekhex_get_symbol_info (ignore_abfd, symbol, ret) bfd *ignore_abfd ATTRIBUTE_UNUSED; asymbol *symbol; symbol_info *ret;{ bfd_symbol_info (symbol, ret);}static voidtekhex_print_symbol (ignore_abfd, filep, symbol, how) bfd *ignore_abfd ATTRIBUTE_UNUSED; PTR filep; asymbol *symbol; bfd_print_symbol_type how;{ FILE *file = (FILE *) filep; switch (how) { case bfd_print_symbol_name: fprintf (file, "%s", symbol->name); break; case bfd_print_symbol_more: break; case bfd_print_symbol_all: { CONST char *section_name = symbol->section->name; bfd_print_symbol_vandf ((PTR) file, symbol); fprintf (file, " %-5s %s", section_name, symbol->name); } }}#define tekhex_close_and_cleanup _bfd_generic_close_and_cleanup#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_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#define tekhex_read_minisymbols _bfd_generic_read_minisymbols#define tekhex_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol#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_link_hash_table_create _bfd_generic_link_hash_table_create#define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols#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_windowconst bfd_target tekhex_vec ={ "tekhex", /* name */ bfd_target_tekhex_flavour, 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), (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ 0, /* leading underscore */ ' ', /* ar_pad_char */ 16, /* ar_max_namelen */ 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 */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ { _bfd_dummy_target, tekhex_object_p, /* bfd_check_format */ _bfd_dummy_target, _bfd_dummy_target, }, { bfd_false, tekhex_mkobject, _bfd_generic_mkarchive, bfd_false, }, { /* bfd_write_contents */ bfd_false, tekhex_write_object_contents, _bfd_write_archive_contents, bfd_false, }, BFD_JUMP_TABLE_GENERIC (tekhex), BFD_JUMP_TABLE_COPY (_bfd_generic), BFD_JUMP_TABLE_CORE (_bfd_nocore), BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), BFD_JUMP_TABLE_SYMBOLS (tekhex), BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), BFD_JUMP_TABLE_WRITE (tekhex), BFD_JUMP_TABLE_LINK (tekhex), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), NULL, (PTR) 0};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?