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 + -
显示快捷键?