elf32-v850.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 2,145 行 · 第 1/5 页
C
2,145 行
/* V850-specific support for 32-bit ELF Copyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.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. *//* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char dependencies. As is the gas & simulator code or the v850. */#include "bfd.h"#include "sysdep.h"#include "bfdlink.h"#include "libbfd.h"#include "elf-bfd.h"#include "elf/v850.h"/* sign-extend a 24-bit number */#define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000)static reloc_howto_type *v850_elf_reloc_type_lookup PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));static void v850_elf_info_to_howto_rel PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));static void v850_elf_info_to_howto_rela PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));static bfd_reloc_status_type v850_elf_reloc PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));static boolean v850_elf_is_local_label_name PARAMS ((bfd *, const char *));static boolean v850_elf_relocate_section PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));static bfd_reloc_status_type v850_elf_perform_relocation PARAMS ((bfd *, int, bfd_vma, bfd_byte *));static boolean v850_elf_check_relocs PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));static void remember_hi16s_reloc PARAMS ((bfd *, bfd_vma, bfd_byte *));static bfd_byte * find_remembered_hi16s_reloc PARAMS ((bfd_vma, boolean *));static bfd_reloc_status_type v850_elf_final_link_relocate PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma, bfd_vma, bfd_vma, struct bfd_link_info *, asection *, int));static boolean v850_elf_object_p PARAMS ((bfd *));static boolean v850_elf_fake_sections PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));static void v850_elf_final_write_processing PARAMS ((bfd *, boolean));static boolean v850_elf_set_private_flags PARAMS ((bfd *, flagword));static boolean v850_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *));static boolean v850_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));static boolean v850_elf_print_private_bfd_data PARAMS ((bfd *, PTR));static boolean v850_elf_section_from_bfd_section PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));static void v850_elf_symbol_processing PARAMS ((bfd *, asymbol *));static boolean v850_elf_add_symbol_hook PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, const char **, flagword *, asection **, bfd_vma *));static boolean v850_elf_link_output_symbol_hook PARAMS ((bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection *));static boolean v850_elf_section_from_shdr PARAMS ((bfd *, Elf_Internal_Shdr *, char *));/* Note: It is REQUIRED that the 'type' value of each entry in this array match the index of the entry in the array. */static reloc_howto_type v850_elf_howto_table[] ={ /* This reloc does nothing. */ HOWTO (R_V850_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_V850_NONE", /* name */ false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ false), /* pcrel_offset */ /* A PC relative 9 bit branch. */ HOWTO (R_V850_9_PCREL, /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ true, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_9_PCREL", /* name */ false, /* partial_inplace */ 0x00ffffff, /* src_mask */ 0x00ffffff, /* dst_mask */ true), /* pcrel_offset */ /* A PC relative 22 bit branch. */ HOWTO (R_V850_22_PCREL, /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 22, /* bitsize */ true, /* pc_relative */ 7, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_22_PCREL", /* name */ false, /* partial_inplace */ 0x07ffff80, /* src_mask */ 0x07ffff80, /* dst_mask */ true), /* pcrel_offset */ /* High 16 bits of symbol value. */ HOWTO (R_V850_HI16_S, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_HI16_S", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* High 16 bits of symbol value. */ HOWTO (R_V850_HI16, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_HI16", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Low 16 bits of symbol value. */ HOWTO (R_V850_LO16, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_LO16", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Simple 32bit reloc. */ HOWTO (R_V850_32, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_32", /* name */ false, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ false), /* pcrel_offset */ /* Simple 16bit reloc. */ HOWTO (R_V850_16, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_V850_16", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* Simple 8bit reloc. */ HOWTO (R_V850_8, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 8, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_V850_8", /* name */ false, /* partial_inplace */ 0xff, /* src_mask */ 0xff, /* dst_mask */ false), /* pcrel_offset */ /* 16 bit offset from the short data area pointer. */ HOWTO (R_V850_SDA_16_16_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_SDA_16_16_OFFSET", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* 15 bit offset from the short data area pointer. */ HOWTO (R_V850_SDA_15_16_OFFSET, /* type */ 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 1, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_SDA_15_16_OFFSET", /* name */ false, /* partial_inplace */ 0xfffe, /* src_mask */ 0xfffe, /* dst_mask */ false), /* pcrel_offset */ /* 16 bit offset from the zero data area pointer. */ HOWTO (R_V850_ZDA_16_16_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_ZDA_16_16_OFFSET", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ false), /* pcrel_offset */ /* 15 bit offset from the zero data area pointer. */ HOWTO (R_V850_ZDA_15_16_OFFSET, /* type */ 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 1, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_ZDA_15_16_OFFSET", /* name */ false, /* partial_inplace */ 0xfffe, /* src_mask */ 0xfffe, /* dst_mask */ false), /* pcrel_offset */ /* 6 bit offset from the tiny data area pointer. */ HOWTO (R_V850_TDA_6_8_OFFSET, /* type */ 2, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 8, /* bitsize */ false, /* pc_relative */ 1, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_TDA_6_8_OFFSET", /* name */ false, /* partial_inplace */ 0x7e, /* src_mask */ 0x7e, /* dst_mask */ false), /* pcrel_offset */ /* 8 bit offset from the tiny data area pointer. */ HOWTO (R_V850_TDA_7_8_OFFSET, /* type */ 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 8, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_TDA_7_8_OFFSET", /* name */ false, /* partial_inplace */ 0x7f, /* src_mask */ 0x7f, /* dst_mask */ false), /* pcrel_offset */ /* 7 bit offset from the tiny data area pointer. */ HOWTO (R_V850_TDA_7_7_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 7, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_TDA_7_7_OFFSET", /* name */ false, /* partial_inplace */ 0x7f, /* src_mask */ 0x7f, /* dst_mask */ false), /* pcrel_offset */ /* 16 bit offset from the tiny data area pointer! */ HOWTO (R_V850_TDA_16_16_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_TDA_16_16_OFFSET", /* name */ false, /* partial_inplace */ 0xffff, /* src_mask */ 0xfff, /* dst_mask */ false), /* pcrel_offset */ /* 5 bit offset from the tiny data area pointer. */ HOWTO (R_V850_TDA_4_5_OFFSET, /* type */ 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 5, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_TDA_4_5_OFFSET", /* name */ false, /* partial_inplace */ 0x0f, /* src_mask */ 0x0f, /* dst_mask */ false), /* pcrel_offset */ /* 4 bit offset from the tiny data area pointer. */ HOWTO (R_V850_TDA_4_4_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 4, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_TDA_4_4_OFFSET", /* name */ false, /* partial_inplace */ 0x0f, /* src_mask */ 0x0f, /* dst_mask */ false), /* pcrel_offset */ /* 16 bit offset from the short data area pointer. */ HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */ false, /* partial_inplace */ 0xfffe0020, /* src_mask */ 0xfffe0020, /* dst_mask */ false), /* pcrel_offset */ /* 16 bit offset from the zero data area pointer. */ HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */ false, /* partial_inplace */ 0xfffe0020, /* src_mask */ 0xfffe0020, /* dst_mask */ false), /* pcrel_offset */ /* 6 bit offset from the call table base pointer. */ HOWTO (R_V850_CALLT_6_7_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 7, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_CALLT_6_7_OFFSET", /* name */ false, /* partial_inplace */ 0x3f, /* src_mask */ 0x3f, /* dst_mask */ false), /* pcrel_offset */ /* 16 bit offset from the call table base pointer. */ HOWTO (R_V850_CALLT_16_16_OFFSET, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ v850_elf_reloc, /* special_function */ "R_V850_CALLT_16_16_OFFSET", /* name */ false, /* partial_inplace */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?