elf32-d30v.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 561 行 · 第 1/2 页
C
561 行
/* D30V-specific support for 32-bit ELF Copyright 1997, 1998, 1999, 2000 Free Software Foundation, Inc. Contributed by Martin Hunt (hunt@cygnus.com).This file is part of BFD, the Binary File Descriptor library.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include "bfd.h"#include "sysdep.h"#include "libbfd.h"#include "elf-bfd.h"#include "elf/d30v.h"static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));static void d30v_info_to_howto_rel PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));static void d30v_info_to_howto_rela PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));static bfd_reloc_status_type bfd_elf_d30v_reloc PARAMS (( bfd *abfd, arelent *reloc_entry, asymbol *symbol, PTR data, asection *input_section, bfd *output_bfd, char **error_message));static bfd_reloc_status_type bfd_elf_d30v_reloc_21 PARAMS (( bfd *abfd, arelent *reloc_entry, asymbol *symbol, PTR data, asection *input_section, bfd *output_bfd, char **error_message));static reloc_howto_type elf_d30v_howto_table[] ={ /* This reloc does nothing. */ HOWTO (R_D30V_NONE, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_D30V_NONE", /* name */ false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ false), /* pcrel_offset */ /* A 6 bit absolute relocation */ HOWTO (R_D30V_6, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 6, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_D30V_6", /* name */ false, /* partial_inplace */ 0x3f, /* src_mask */ 0x3f, /* dst_mask */ false), /* pcrel_offset */ /* A relative 9 bit relocation, right shifted by 3 */ HOWTO (R_D30V_9_PCREL, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 6, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc_21, /* special_function */ "R_D30V_9_PCREL", /* name */ false, /* partial_inplace */ 0x3f, /* src_mask */ 0x3f, /* dst_mask */ true), /* pcrel_offset */ /* A relative 9 bit relocation, right shifted by 3 */ HOWTO (R_D30V_9_PCREL_R, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 6, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc_21, /* special_function */ "R_D30V_9_PCREL_R", /* name */ false, /* partial_inplace */ 0x3f, /* src_mask */ 0x3f, /* dst_mask */ true), /* pcrel_offset */ /* An absolute 15 bit relocation, right shifted by 3 */ HOWTO (R_D30V_15, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_D30V_15", /* name */ false, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ false), /* pcrel_offset */ /* A relative 15 bit relocation, right shifted by 3 */ HOWTO (R_D30V_15_PCREL, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc_21, /* special_function */ "R_D30V_15_PCREL", /* name */ false, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ true), /* pcrel_offset */ /* A relative 15 bit relocation, right shifted by 3 */ HOWTO (R_D30V_15_PCREL_R, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc_21, /* special_function */ "R_D30V_15_PCREL_R", /* name */ false, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ true), /* pcrel_offset */ /* An absolute 21 bit relocation, right shifted by 3 */ HOWTO (R_D30V_21, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 18, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_D30V_21", /* name */ false, /* partial_inplace */ 0x3ffff, /* src_mask */ 0x3ffff, /* dst_mask */ false), /* pcrel_offset */ /* A relative 21 bit relocation, right shifted by 3 */ HOWTO (R_D30V_21_PCREL, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 18, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc_21, /* special_function */ "R_D30V_21_PCREL", /* name */ false, /* partial_inplace */ 0x3ffff, /* src_mask */ 0x3ffff, /* dst_mask */ true), /* pcrel_offset */ /* A relative 21 bit relocation, right shifted by 3, in the Right container */ HOWTO (R_D30V_21_PCREL_R, /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 18, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc_21, /* special_function */ "R_D30V_21_PCREL_R", /* name */ false, /* partial_inplace */ 0x3ffff, /* src_mask */ 0x3ffff, /* dst_mask */ true), /* pcrel_offset */ /* A D30V 32 bit absolute relocation */ HOWTO (R_D30V_32, /* type */ 0, /* rightshift */ 4, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_d30v_reloc, /* special_function */ "R_D30V_32", /* name */ false, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ false), /* pcrel_offset */ /* A relative 32 bit relocation */ HOWTO (R_D30V_32_PCREL, /* type */ 0, /* rightshift */ 4, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_d30v_reloc, /* special_function */ "R_D30V_32_PCREL", /* name */ false, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ true), /* pcrel_offset */ /* A regular 32 bit absolute relocation */ HOWTO (R_D30V_32_NORMAL, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_D30V_32_NORMAL", /* name */ false, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ false), /* pcrel_offset */};#define MAX32 ((bfd_signed_vma) 0x7fffffff)#define MIN32 (- MAX32 - 1)static bfd_reloc_status_typebfd_elf_d30v_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, error_message) bfd *abfd; arelent *reloc_entry; asymbol *symbol; PTR data; asection *input_section; bfd *output_bfd; char **error_message;{ bfd_signed_vma relocation; bfd_vma in1, in2, num; bfd_vma tmp_addr = 0; bfd_reloc_status_type r; asection *reloc_target_output_section; bfd_size_type addr = reloc_entry->address; bfd_reloc_status_type flag = bfd_reloc_ok; bfd_vma output_base = 0; reloc_howto_type *howto = reloc_entry->howto; int make_absolute = 0; if (output_bfd != (bfd *) NULL) { /* Partial linking -- do nothing. */ reloc_entry->address += input_section->output_offset; return bfd_reloc_ok; } r = bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, error_message);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?