versados.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 902 行 · 第 1/2 页
C
902 行
} EDATA (abfd, otr->esdid - 1).pc = dst_idx; if (!contents && need_contents) esdid->contents = (unsigned char *) bfd_alloc (abfd, esdid->section->_raw_size);}static booleanversados_scan (abfd) bfd *abfd;{ int loop = 1; int i; int j; int nsecs = 0; VDATA (abfd)->stringlen = 0; VDATA (abfd)->nrefs = 0; VDATA (abfd)->ndefs = 0; VDATA (abfd)->ref_idx = 0; VDATA (abfd)->def_idx = 0; VDATA (abfd)->pass_2_done = 0; while (loop) { union ext_any any; if (!get_record (abfd, &any)) return true; switch (any.header.type) { case VHEADER: break; case VEND: loop = 0; break; case VESTDEF: process_esd (abfd, &any.esd, 1); break; case VOTR: process_otr (abfd, &any.otr, 1); break; } } /* Now allocate space for the relocs and sections */ VDATA (abfd)->nrefs = VDATA (abfd)->ref_idx; VDATA (abfd)->ndefs = VDATA (abfd)->def_idx; VDATA (abfd)->ref_idx = 0; VDATA (abfd)->def_idx = 0; abfd->symcount = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs; for (i = 0; i < 16; i++) { struct esdid *esdid = &EDATA (abfd, i); if (esdid->section) { esdid->section->relocation = (arelent *) bfd_alloc (abfd, sizeof (arelent) * esdid->relocs); esdid->pc = 0; if (esdid->contents) esdid->section->flags |= SEC_HAS_CONTENTS | SEC_LOAD; esdid->section->reloc_count = esdid->relocs; if (esdid->relocs) esdid->section->flags |= SEC_RELOC; esdid->relocs = 0; /* Add an entry into the symbol table for it */ nsecs++; VDATA (abfd)->stringlen += strlen (esdid->section->name) + 1; } } abfd->symcount += nsecs; VDATA (abfd)->symbols = (asymbol *) bfd_alloc (abfd, sizeof (asymbol) * (abfd->symcount)); VDATA (abfd)->strings = bfd_alloc (abfd, VDATA (abfd)->stringlen); if ((VDATA (abfd)->symbols == NULL && abfd->symcount > 0) || (VDATA (abfd)->strings == NULL && VDATA (abfd)->stringlen > 0)) return false; /* Actually fill in the section symbols, we stick them at the end of the table */ for (j = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs, i = 0; i < 16; i++) { struct esdid *esdid = &EDATA (abfd, i); asection *sec = esdid->section; if (sec) { asymbol *s = VDATA (abfd)->symbols + j; s->name = new_symbol_string (abfd, sec->name); s->section = sec; s->flags = BSF_LOCAL; s->value = 0; s->the_bfd = abfd; j++; } } if (abfd->symcount) abfd->flags |= HAS_SYMS; /* Set this to nsecs - since we've already planted the section symbols */ VDATA (abfd)->nsecsyms = nsecs; VDATA (abfd)->ref_idx = 0; return 1;}/* Check whether an existing file is a versados file. */static const bfd_target *versados_object_p (abfd) bfd *abfd;{ struct ext_vheader ext; unsigned char len; if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) return NULL; if (bfd_read (&len, 1, 1, abfd) != 1) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_wrong_format); return NULL; } if (bfd_read (&ext.type, 1, len, abfd) != len) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_wrong_format); return NULL; } /* We guess that the language field will never be larger than 10. In sample files, it is always either 0 or 1. Checking for this prevents confusion with Intel Hex files. */ if (ext.type != VHEADER || ext.lang > 10) { bfd_set_error (bfd_error_wrong_format); return NULL; } /* OK, looks like a record, build the tdata and read in. */ if (!versados_mkobject (abfd) || !versados_scan (abfd)) return NULL; return abfd->xvec;}static booleanversados_pass_2 (abfd) bfd *abfd;{ union ext_any any; if (VDATA (abfd)->pass_2_done) return 1; if (bfd_seek (abfd, 0, SEEK_SET) != 0) return 0; VDATA (abfd)->es_done = ES_BASE; /* read records till we get to where we want to be */ while (1) { get_record (abfd, &any); switch (any.header.type) { case VEND: VDATA (abfd)->pass_2_done = 1; return 1; case VESTDEF: process_esd (abfd, &any.esd, 2); break; case VOTR: process_otr (abfd, &any.otr, 2); break; } }}static booleanversados_get_section_contents (abfd, section, location, offset, count) bfd *abfd; asection *section; PTR location; file_ptr offset; bfd_size_type count;{ if (!versados_pass_2 (abfd)) return false; memcpy (location, EDATA (abfd, section->target_index).contents + offset, (size_t) count); return true;}#define versados_get_section_contents_in_window \ _bfd_generic_get_section_contents_in_windowstatic booleanversados_set_section_contents (abfd, section, location, offset, bytes_to_do) bfd *abfd ATTRIBUTE_UNUSED; sec_ptr section ATTRIBUTE_UNUSED; PTR location ATTRIBUTE_UNUSED; file_ptr offset ATTRIBUTE_UNUSED; bfd_size_type bytes_to_do ATTRIBUTE_UNUSED;{ return false;}static intversados_sizeof_headers (abfd, exec) bfd *abfd ATTRIBUTE_UNUSED; boolean exec ATTRIBUTE_UNUSED;{ return 0;}static asymbol *versados_make_empty_symbol (abfd) bfd *abfd;{ asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); if (new) new->the_bfd = abfd; return new;}/* Return the amount of memory needed to read the symbol table. */static longversados_get_symtab_upper_bound (abfd) bfd *abfd;{ return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *);}/* Return the symbol table. */static longversados_get_symtab (abfd, alocation) bfd *abfd; asymbol **alocation;{ unsigned int symcount = bfd_get_symcount (abfd); unsigned int i; asymbol *s; versados_pass_2 (abfd); for (i = 0, s = VDATA (abfd)->symbols; i < symcount; s++, i++) { *alocation++ = s; } *alocation = NULL; return symcount;}voidversados_get_symbol_info (ignore_abfd, symbol, ret) bfd *ignore_abfd ATTRIBUTE_UNUSED; asymbol *symbol; symbol_info *ret;{ bfd_symbol_info (symbol, ret);}voidversados_print_symbol (ignore_abfd, afile, symbol, how) bfd *ignore_abfd ATTRIBUTE_UNUSED; PTR afile; asymbol *symbol; bfd_print_symbol_type how;{ FILE *file = (FILE *) afile; switch (how) { case bfd_print_symbol_name: fprintf (file, "%s", symbol->name); break; default: bfd_print_symbol_vandf ((PTR) file, symbol); fprintf (file, " %-5s %s", symbol->section->name, symbol->name); }}longversados_get_reloc_upper_bound (abfd, asect) bfd *abfd ATTRIBUTE_UNUSED; sec_ptr asect;{ return (asect->reloc_count + 1) * sizeof (arelent *);}longversados_canonicalize_reloc (abfd, section, relptr, symbols) bfd *abfd; sec_ptr section; arelent **relptr; asymbol **symbols;{ unsigned int count; arelent *src; versados_pass_2 (abfd); src = section->relocation; if (!EDATA (abfd, section->target_index).donerel) { EDATA (abfd, section->target_index).donerel = 1; /* translate from indexes to symptr ptrs */ for (count = 0; count < section->reloc_count; count++) { int esdid = (int) src[count].sym_ptr_ptr; if (esdid == 0) { src[count].sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr; } else if (esdid < ES_BASE) /* Section relative thing */ { struct esdid *e = &EDATA (abfd, esdid - 1); if (!section) { /** relocation relative to section which was never declared ! */ } src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr; } else { src[count].sym_ptr_ptr = symbols + esdid - ES_BASE; } } } for (count = 0; count < section->reloc_count; count++) { *relptr++ = src++; } *relptr = 0; return section->reloc_count;}#define versados_close_and_cleanup _bfd_generic_close_and_cleanup#define versados_bfd_free_cached_info _bfd_generic_bfd_free_cached_info#define versados_new_section_hook _bfd_generic_new_section_hook#define versados_bfd_is_local_label_name bfd_generic_is_local_label_name#define versados_get_lineno _bfd_nosymbols_get_lineno#define versados_find_nearest_line _bfd_nosymbols_find_nearest_line#define versados_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol#define versados_read_minisymbols _bfd_generic_read_minisymbols#define versados_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol#define versados_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup#define versados_set_arch_mach bfd_default_set_arch_mach#define versados_bfd_get_relocated_section_contents \ bfd_generic_get_relocated_section_contents#define versados_bfd_relax_section bfd_generic_relax_section#define versados_bfd_gc_sections bfd_generic_gc_sections#define versados_bfd_link_hash_table_create _bfd_generic_link_hash_table_create#define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols#define versados_bfd_final_link _bfd_generic_final_link#define versados_bfd_link_split_section _bfd_generic_link_split_sectionconst bfd_target versados_vec ={ "versados", /* name */ bfd_target_versados_flavour, BFD_ENDIAN_BIG, /* target byte order */ BFD_ENDIAN_BIG, /* target headers byte order */ (HAS_RELOC | EXEC_P | /* object flags */ HAS_LINENO | HAS_DEBUG | HAS_SYMS | 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, versados_object_p, /* bfd_check_format */ _bfd_dummy_target, _bfd_dummy_target, }, { bfd_false, versados_mkobject, _bfd_generic_mkarchive, bfd_false, }, { /* bfd_write_contents */ bfd_false, bfd_false, _bfd_write_archive_contents, bfd_false, }, BFD_JUMP_TABLE_GENERIC (versados), BFD_JUMP_TABLE_COPY (_bfd_generic), BFD_JUMP_TABLE_CORE (_bfd_nocore), BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), BFD_JUMP_TABLE_SYMBOLS (versados), BFD_JUMP_TABLE_RELOCS (versados), BFD_JUMP_TABLE_WRITE (versados), BFD_JUMP_TABLE_LINK (versados), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), NULL, (PTR) 0};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?