⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elf64-mips.c

📁 基于4个mips核的noc设计
💻 C
📖 第 1 页 / 共 5 页
字号:
/* MIPS-specific support for 64-bit ELF   Copyright 1996, 1997, 1998, 1999, 2000, 2001   Free Software Foundation, Inc.   Ian Lance Taylor, Cygnus Support   Linker support added by Mark Mitchell, CodeSourcery, LLC.   <mark@codesourcery.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.  *//* This file supports the 64-bit MIPS ELF ABI.   The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file   overrides the usual ELF reloc handling, and handles reading and   writing the relocations here.   The MIPS 64-bit ELF ABI also uses an unusual archive map format.  */#include "bfd.h"#include "sysdep.h"#include "libbfd.h"#include "aout/ar.h"#include "bfdlink.h"#include "genlink.h"#include "elf-bfd.h"#include "elf/mips.h"/* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to   use ECOFF.  However, we support it anyhow for an easier changeover.  */#include "coff/sym.h"#include "coff/symconst.h"#include "coff/internal.h"#include "coff/ecoff.h"/* The 64 bit versions of the mdebug data structures are in alpha.h.  */#include "coff/alpha.h"#define ECOFF_SIGNED_64#include "ecoffswap.h"static void mips_elf64_swap_reloc_in  PARAMS ((bfd *, const Elf64_Mips_External_Rel *,	   Elf64_Mips_Internal_Rel *));static void mips_elf64_swap_reloca_in  PARAMS ((bfd *, const Elf64_Mips_External_Rela *,	   Elf64_Mips_Internal_Rela *));static void mips_elf64_swap_reloc_out  PARAMS ((bfd *, const Elf64_Mips_Internal_Rel *,	   Elf64_Mips_External_Rel *));static void mips_elf64_swap_reloca_out  PARAMS ((bfd *, const Elf64_Mips_Internal_Rela *,	   Elf64_Mips_External_Rela *));static void mips_elf64_be_swap_reloc_in  PARAMS ((bfd *, const bfd_byte *, Elf_Internal_Rel *));static void mips_elf64_be_swap_reloc_out  PARAMS ((bfd *, const Elf_Internal_Rel *, bfd_byte *));static void mips_elf64_be_swap_reloca_in  PARAMS ((bfd *, const bfd_byte *, Elf_Internal_Rela *));static void mips_elf64_be_swap_reloca_out  PARAMS ((bfd *, const Elf_Internal_Rela *, bfd_byte *));static reloc_howto_type *mips_elf64_reloc_type_lookup  PARAMS ((bfd *, bfd_reloc_code_real_type));static long mips_elf64_get_reloc_upper_bound PARAMS ((bfd *, asection *));static boolean mips_elf64_slurp_one_reloc_table  PARAMS ((bfd *, asection *, asymbol **, const Elf_Internal_Shdr *));static boolean mips_elf64_slurp_reloc_table  PARAMS ((bfd *, asection *, asymbol **, boolean));static void mips_elf64_write_relocs PARAMS ((bfd *, asection *, PTR));static boolean mips_elf64_slurp_armap PARAMS ((bfd *));static boolean mips_elf64_write_armap  PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));/* In case we're on a 32-bit machine, construct a 64-bit "-1" value   from smaller values.  Start with zero, widen, *then* decrement.  */#define MINUS_ONE	(((bfd_vma)0) - 1)/* The number of local .got entries we reserve.  */#define MIPS_RESERVED_GOTNO (2)/* The relocation table used for SHT_REL sections.  */static reloc_howto_type mips_elf64_howto_table_rel[] ={  /* No relocation.  */  HOWTO (R_MIPS_NONE,		/* type */	 0,			/* rightshift */	 0,			/* size (0 = byte, 1 = short, 2 = long) */	 0,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_dont, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_NONE",		/* name */	 false,			/* partial_inplace */	 0,			/* src_mask */	 0,			/* dst_mask */	 false),		/* pcrel_offset */  /* 16 bit relocation.  */  HOWTO (R_MIPS_16,		/* type */	 0,			/* rightshift */	 1,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_16",		/* name */	 true,			/* partial_inplace */	 0xffff,		/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 32 bit relocation.  */  HOWTO (R_MIPS_32,		/* 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_MIPS_32",		/* name */	 true,			/* partial_inplace */	 0xffffffff,		/* src_mask */	 0xffffffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 32 bit symbol relative relocation.  */  HOWTO (R_MIPS_REL32,		/* 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_MIPS_REL32",	/* name */	 true,			/* partial_inplace */	 0xffffffff,		/* src_mask */	 0xffffffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 26 bit branch address.  */  HOWTO (R_MIPS_26,		/* type */	 2,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 26,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_dont, /* complain_on_overflow */				/* This needs complex overflow				   detection, because the upper four				   bits must match the PC + 4.  */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_26",		/* name */	 true,			/* partial_inplace */	 0x3ffffff,		/* src_mask */	 0x3ffffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* High 16 bits of symbol value.  */  HOWTO (R_MIPS_HI16,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_dont, /* complain_on_overflow */	 _bfd_mips_elf_hi16_reloc,	/* special_function */	 "R_MIPS_HI16",		/* name */	 true,			/* partial_inplace */	 0xffff,		/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Low 16 bits of symbol value.  */  HOWTO (R_MIPS_LO16,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_dont, /* complain_on_overflow */	 _bfd_mips_elf_lo16_reloc,	/* special_function */	 "R_MIPS_LO16",		/* name */	 true,			/* partial_inplace */	 0xffff,		/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* GP relative reference.  */  HOWTO (R_MIPS_GPREL16,	/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_signed, /* complain_on_overflow */	 _bfd_mips_elf_gprel16_reloc, /* special_function */	 "R_MIPS_GPREL16",	/* name */	 true,			/* partial_inplace */	 0xffff,		/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Reference to literal section.  */  HOWTO (R_MIPS_LITERAL,	/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_signed, /* complain_on_overflow */	 _bfd_mips_elf_gprel16_reloc, /* special_function */	 "R_MIPS_LITERAL",	/* name */	 true,			/* partial_inplace */	 0xffff,		/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Reference to global offset table.  */  HOWTO (R_MIPS_GOT16,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_signed, /* complain_on_overflow */	 _bfd_mips_elf_got16_reloc,	/* special_function */	 "R_MIPS_GOT16",	/* name */	 false,			/* partial_inplace */	 0,			/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 16 bit PC relative reference.  */  HOWTO (R_MIPS_PC16,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 true,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_signed, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_PC16",		/* name */	 true,			/* partial_inplace */	 0xffff,		/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 16 bit call through global offset table.  */  /* FIXME: This is not handled correctly.  */  HOWTO (R_MIPS_CALL16,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_signed, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_CALL16",	/* name */	 false,			/* partial_inplace */	 0,			/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 32 bit GP relative reference.  */  HOWTO (R_MIPS_GPREL32,	/* 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_mips_elf_gprel32_reloc, /* special_function */	 "R_MIPS_GPREL32",	/* name */	 true,			/* partial_inplace */	 0xffffffff,		/* src_mask */	 0xffffffff,		/* dst_mask */	 false),		/* pcrel_offset */    { 13 },    { 14 },    { 15 },  /* A 5 bit shift field.  */  HOWTO (R_MIPS_SHIFT5,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 5,			/* bitsize */	 false,			/* pc_relative */	 6,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_SHIFT5",	/* name */	 true,			/* partial_inplace */	 0x000007c0,		/* src_mask */	 0x000007c0,		/* dst_mask */	 false),		/* pcrel_offset */  /* A 6 bit shift field.  */  /* FIXME: This is not handled correctly; a special function is     needed to put the most significant bit in the right place.  */  HOWTO (R_MIPS_SHIFT6,		/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 6,			/* bitsize */	 false,			/* pc_relative */	 6,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_SHIFT6",	/* name */	 true,			/* partial_inplace */	 0x000007c4,		/* src_mask */	 0x000007c4,		/* dst_mask */	 false),		/* pcrel_offset */  /* 64 bit relocation.  */  HOWTO (R_MIPS_64,		/* type */	 0,			/* rightshift */	 4,			/* size (0 = byte, 1 = short, 2 = long) */	 64,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_64",		/* name */	 true,			/* partial_inplace */	 MINUS_ONE,		/* src_mask */	 MINUS_ONE,		/* dst_mask */	 false),		/* pcrel_offset */  /* Displacement in the global offset table.  */  /* FIXME: Not handled correctly.  */  HOWTO (R_MIPS_GOT_DISP,	/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_GOT_DISP",	/* name */	 true,			/* partial_inplace */	 0x0000ffff,		/* src_mask */	 0x0000ffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Displacement to page pointer in the global offset table.  */  /* FIXME: Not handled correctly.  */  HOWTO (R_MIPS_GOT_PAGE,	/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_GOT_PAGE",	/* name */	 true,			/* partial_inplace */	 0x0000ffff,		/* src_mask */	 0x0000ffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Offset from page pointer in the global offset table.  */  /* FIXME: Not handled correctly.  */  HOWTO (R_MIPS_GOT_OFST,	/* type */	 0,			/* rightshift */	 2,			/* size (0 = byte, 1 = short, 2 = long) */	 16,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 bfd_elf_generic_reloc,	/* special_function */	 "R_MIPS_GOT_OFST",	/* name */	 true,			/* partial_inplace */	 0x0000ffff,		/* src_mask */	 0x0000ffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* High 16 bits of displacement in global offset table.  */  /* FIXME: Not handled correctly.  */  HOWTO (R_MIPS_GOT_HI16,	/* type */	 0,			/* rightshift */	 2,			/* 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_MIPS_GOT_HI16",	/* name */	 true,			/* partial_inplace */	 0x0000ffff,		/* src_mask */	 0x0000ffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Low 16 bits of displacement in global offset table.  */  /* FIXME: Not handled correctly.  */  HOWTO (R_MIPS_GOT_LO16,	/* type */	 0,			/* rightshift */	 2,			/* 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_MIPS_GOT_LO16",	/* name */	 true,			/* partial_inplace */	 0x0000ffff,		/* src_mask */	 0x0000ffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* 64 bit substraction.  */  /* FIXME: Not handled correctly.  */  HOWTO (R_MIPS_SUB,		/* type */	 0,			/* rightshift */	 4,			/* size (0 = byte, 1 = short, 2 = long) */	 64,			/* bitsize */	 false,			/* pc_relative */	 0,			/* bitpos */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -