coff-i960.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 666 行 · 第 1/2 页
C
666 行
if (esym == NULL) return false; if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) return false; for (o = abfd->sections; o != NULL; o = o->next) { struct internal_syment isym; strncpy (isym._n._n_name, o->name, SYMNMLEN); isym.n_value = 0; isym.n_scnum = o->target_index; isym.n_type = T_NULL; isym.n_sclass = C_STAT; isym.n_numaux = 0; bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym); if (bfd_write (esym, symesz, 1, abfd) != symesz) { free (esym); return false; } obj_raw_syment_count (abfd) += 1; } free (esym); return true;}/* The reloc processing routine for the optimized COFF linker. */static booleancoff_i960_relocate_section (output_bfd, info, input_bfd, input_section, contents, relocs, syms, sections) bfd *output_bfd ATTRIBUTE_UNUSED; struct bfd_link_info *info; bfd *input_bfd; asection *input_section; bfd_byte *contents; struct internal_reloc *relocs; struct internal_syment *syms; asection **sections;{ struct internal_reloc *rel; struct internal_reloc *relend; rel = relocs; relend = rel + input_section->reloc_count; for (; rel < relend; rel++) { long symndx; struct coff_link_hash_entry *h; struct internal_syment *sym; bfd_vma addend; bfd_vma val; reloc_howto_type *howto; bfd_reloc_status_type rstat = bfd_reloc_ok; boolean done; symndx = rel->r_symndx; if (symndx == -1) { h = NULL; sym = NULL; } else { h = obj_coff_sym_hashes (input_bfd)[symndx]; sym = syms + symndx; } if (sym != NULL && sym->n_scnum != 0) addend = - sym->n_value; else addend = 0; switch (rel->r_type) { case 17: howto = &howto_rellong; break; case 25: howto = &howto_iprmed; break; case 27: howto = &howto_optcall; break; default: bfd_set_error (bfd_error_bad_value); return false; } val = 0; if (h == NULL) { asection *sec; if (symndx == -1) { sec = bfd_abs_section_ptr; val = 0; } else { sec = sections[symndx]; val = (sec->output_section->vma + sec->output_offset + sym->n_value - sec->vma); } } else { if (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) { asection *sec; sec = h->root.u.def.section; val = (h->root.u.def.value + sec->output_section->vma + sec->output_offset); } else if (! info->relocateable) { if (! ((*info->callbacks->undefined_symbol) (info, h->root.root.string, input_bfd, input_section, rel->r_vaddr - input_section->vma, true))) return false; } } done = false; if (howto->type == R_OPTCALL && ! info->relocateable && symndx != -1) { int class; if (h != NULL) class = h->class; else class = sym->n_sclass; switch (class) { case C_NULL: /* This symbol is apparently not from a COFF input file. We warn, and then assume that it is not a leaf function. */ if (! ((*info->callbacks->reloc_dangerous) (info, _("uncertain calling convention for non-COFF symbol"), input_bfd, input_section, rel->r_vaddr - input_section->vma))) return false; break; case C_LEAFSTAT: case C_LEAFEXT: /* This is a call to a leaf procedure; use the bal instruction. */ { long olf; unsigned long word; if (h != NULL) { BFD_ASSERT (h->numaux == 2); olf = h->aux[1].x_bal.x_balntry; } else { bfd_byte *esyms; union internal_auxent aux; BFD_ASSERT (sym->n_numaux == 2); esyms = (bfd_byte *) obj_coff_external_syms (input_bfd); esyms += (symndx + 2) * bfd_coff_symesz (input_bfd); bfd_coff_swap_aux_in (input_bfd, (PTR) esyms, sym->n_type, sym->n_sclass, 1, sym->n_numaux, (PTR) &aux); olf = aux.x_bal.x_balntry; } word = bfd_get_32 (input_bfd, (contents + (rel->r_vaddr - input_section->vma))); word = ((word + olf - val) & BAL_MASK) | BAL; bfd_put_32 (input_bfd, word, (contents + (rel->r_vaddr - input_section->vma))); done = true; } break; case C_SCALL: BFD_ASSERT (0); break; } } if (! done) { if (howto->pc_relative) addend += input_section->vma; rstat = _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_vaddr - input_section->vma, val, addend); } switch (rstat) { default: abort (); case bfd_reloc_ok: break; case bfd_reloc_overflow: { const char *name; char buf[SYMNMLEN + 1]; if (symndx == -1) name = "*ABS*"; else if (h != NULL) name = h->root.root.string; else { name = _bfd_coff_internal_syment_name (input_bfd, sym, buf); if (name == NULL) return false; } if (! ((*info->callbacks->reloc_overflow) (info, name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_vaddr - input_section->vma))) return false; } } } return true;}/* Adjust the symbol index of any reloc against a global symbol to instead be a reloc against the internal symbol we created specially for the section. */static booleancoff_i960_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp) bfd *obfd ATTRIBUTE_UNUSED; struct bfd_link_info *info ATTRIBUTE_UNUSED; bfd *ibfd; asection *sec ATTRIBUTE_UNUSED; struct internal_reloc *irel; boolean *adjustedp;{ struct coff_link_hash_entry *h; *adjustedp = false; h = obj_coff_sym_hashes (ibfd)[irel->r_symndx]; if (h == NULL || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak)) return true; irel->r_symndx = h->root.u.def.section->output_section->target_index - 1; *adjustedp = true; return true;}#define coff_bfd_is_local_label_name coff_i960_is_local_label_name#define coff_start_final_link coff_i960_start_final_link#define coff_relocate_section coff_i960_relocate_section#define coff_adjust_symndx coff_i960_adjust_symndx#define coff_bfd_reloc_type_lookup coff_i960_reloc_type_lookup#include "coffcode.h"extern const bfd_target icoff_big_vec;CREATE_LITTLE_COFF_TARGET_VEC (icoff_little_vec, "coff-Intel-little", 0, 0, '_', & icoff_big_vec)const bfd_target icoff_big_vec ={ "coff-Intel-big", /* name */ bfd_target_coff_flavour, BFD_ENDIAN_LITTLE, /* data byte order is little */ BFD_ENDIAN_BIG, /* header byte order is big */ (HAS_RELOC | EXEC_P | /* object flags */ HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | WP_TEXT), (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ '_', /* leading underscore */ '/', /* ar_pad_char */ 15, /* ar_max_namelen */bfd_getl64, bfd_getl_signed_64, bfd_putl64, bfd_getl32, bfd_getl_signed_32, bfd_putl32, bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* 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, coff_object_p, /* bfd_check_format */ bfd_generic_archive_p, _bfd_dummy_target}, {bfd_false, coff_mkobject, /* bfd_set_format */ _bfd_generic_mkarchive, bfd_false}, {bfd_false, coff_write_object_contents, /* bfd_write_contents */ _bfd_write_archive_contents, bfd_false}, BFD_JUMP_TABLE_GENERIC (coff), BFD_JUMP_TABLE_COPY (coff), BFD_JUMP_TABLE_CORE (_bfd_nocore), BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), BFD_JUMP_TABLE_SYMBOLS (coff), BFD_JUMP_TABLE_RELOCS (coff), BFD_JUMP_TABLE_WRITE (coff), BFD_JUMP_TABLE_LINK (coff), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), & icoff_little_vec, COFF_SWAP_TABLE};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?