nlm32-ppc.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,046 行 · 第 1/3 页
C
1,046 行
complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_RL", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Load address. */ HOWTO (0xd, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_RLA", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ { 0xe }, /* Non-relocating reference. */ HOWTO (0xf, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_REF", /* name */ false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ false), /* pcrel_offset */ { 0x10 }, { 0x11 }, /* TOC relative indirect load. */ HOWTO (0x12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_TRL", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* TOC relative load address. */ HOWTO (0x13, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_TRLA", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable relative branch. */ HOWTO (0x14, /* type */ 1, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_RRTBI", /* name */ true, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable absolute branch. */ HOWTO (0x15, /* type */ 1, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_RRTBA", /* name */ true, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable call absolute indirect. */ HOWTO (0x16, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_CAI", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable call relative. */ HOWTO (0x17, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_REL", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable branch absolute. */ HOWTO (0x18, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_RBA", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable branch absolute. */ HOWTO (0x19, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_RBAC", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable branch relative. */ HOWTO (0x1a, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "R_REL", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Modifiable branch absolute. */ HOWTO (0x1b, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "R_REL", /* name */ true, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false) /* pcrel_offset */};#define HOWTO_COUNT (sizeof nlm_powerpc_howto_table \ / sizeof nlm_powerpc_howto_table[0])/* Read a PowerPC NLM reloc. */static booleannlm_powerpc_read_reloc (abfd, sym, secp, rel) bfd *abfd; nlmNAME(symbol_type) *sym; asection **secp; arelent *rel;{ struct nlm32_powerpc_external_reloc ext; bfd_vma l_vaddr; unsigned long l_symndx; int l_rtype; int l_rsecnm; asection *code_sec, *data_sec, *bss_sec; /* Read the reloc from the file. */ if (bfd_read (&ext, sizeof ext, 1, abfd) != sizeof ext) return false; /* Swap in the fields. */ l_vaddr = bfd_h_get_32 (abfd, ext.l_vaddr); l_symndx = bfd_h_get_32 (abfd, ext.l_symndx); l_rtype = bfd_h_get_16 (abfd, ext.l_rtype); l_rsecnm = bfd_h_get_16 (abfd, ext.l_rsecnm); /* Get the sections now, for convenience. */ code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME); data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME); /* Work out the arelent fields. */ if (sym != NULL) { /* This is an import. sym_ptr_ptr is filled in by nlm_canonicalize_reloc. */ rel->sym_ptr_ptr = NULL; } else { asection *sec; if (l_symndx == 0) sec = code_sec; else if (l_symndx == 1) sec = data_sec; else if (l_symndx == 2) sec = bss_sec; else { bfd_set_error (bfd_error_bad_value); return false; } rel->sym_ptr_ptr = sec->symbol_ptr_ptr; } rel->addend = 0; BFD_ASSERT ((l_rtype & 0xff) < HOWTO_COUNT); rel->howto = nlm_powerpc_howto_table + (l_rtype & 0xff); BFD_ASSERT (rel->howto->name != NULL && ((l_rtype & 0x8000) != 0 ? (rel->howto->complain_on_overflow == complain_overflow_signed) : (rel->howto->complain_on_overflow == complain_overflow_bitfield)) && ((l_rtype >> 8) & 0x1f) == rel->howto->bitsize - 1); if (l_rsecnm == 0) *secp = code_sec; else if (l_rsecnm == 1) { *secp = data_sec; l_vaddr -= bfd_section_size (abfd, code_sec); } else { bfd_set_error (bfd_error_bad_value); return false; } rel->address = l_vaddr; return true;}#endif /* OLDFORMAT *//* Mangle PowerPC NLM relocs for output. */static booleannlm_powerpc_mangle_relocs (abfd, sec, data, offset, count) bfd *abfd ATTRIBUTE_UNUSED; asection *sec ATTRIBUTE_UNUSED; PTR data ATTRIBUTE_UNUSED; bfd_vma offset ATTRIBUTE_UNUSED; bfd_size_type count ATTRIBUTE_UNUSED;{ return true;}/* Read a PowerPC NLM import record */static booleannlm_powerpc_read_import (abfd, sym) bfd *abfd; nlmNAME(symbol_type) *sym;{ struct nlm_relent *nlm_relocs; /* relocation records for symbol */ bfd_size_type rcount; /* number of relocs */ bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* temporary 32-bit value */ unsigned char symlength; /* length of symbol name */ char *name; if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd) != sizeof (symlength)) return (false); sym -> symbol.the_bfd = abfd; name = bfd_alloc (abfd, symlength + 1); if (name == NULL) return false; if (bfd_read (name, symlength, 1, abfd) != symlength) return (false); name[symlength] = '\0'; sym -> symbol.name = name; sym -> symbol.flags = 0; sym -> symbol.value = 0; sym -> symbol.section = bfd_und_section_ptr; if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) return (false); rcount = bfd_h_get_32 (abfd, temp); nlm_relocs = ((struct nlm_relent *) bfd_alloc (abfd, rcount * sizeof (struct nlm_relent))); if (nlm_relocs == (struct nlm_relent *) NULL) return false; sym -> relocs = nlm_relocs; sym -> rcnt = 0; while (sym -> rcnt < rcount) { asection *section; if (nlm_powerpc_read_reloc (abfd, sym, §ion, &nlm_relocs -> reloc) == false) return false; nlm_relocs -> section = section; nlm_relocs++; sym -> rcnt++; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?