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