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

📄 elf32-mips.c

📁 基于4个mips核的noc设计
💻 C
📖 第 1 页 / 共 5 页
字号:
/* These are the constants used to swap the bitfields in a crinfo.  */#define CRINFO_CTYPE (0x1)#define CRINFO_CTYPE_SH (31)#define CRINFO_RTYPE (0xf)#define CRINFO_RTYPE_SH (27)#define CRINFO_DIST2TO (0xff)#define CRINFO_DIST2TO_SH (19)#define CRINFO_RELVADDR (0x7ffff)#define CRINFO_RELVADDR_SH (0)/* A compact relocation info has long (3 words) or short (2 words)   formats.  A short format doesn't have VADDR field and relvaddr   fields contains ((VADDR - vaddr of the previous entry) >> 2).  */#define CRF_MIPS_LONG			1#define CRF_MIPS_SHORT			0/* There are 4 types of compact relocation at least. The value KONST   has different meaning for each type:   (type)		(konst)   CT_MIPS_REL32	Address in data   CT_MIPS_WORD		Address in word (XXX)   CT_MIPS_GPHI_LO	GP - vaddr   CT_MIPS_JMPAD	Address to jump   */#define CRT_MIPS_REL32			0xa#define CRT_MIPS_WORD			0xb#define CRT_MIPS_GPHI_LO		0xc#define CRT_MIPS_JMPAD			0xd#define mips_elf_set_cr_format(x,format)	((x).ctype = (format))#define mips_elf_set_cr_type(x,type)		((x).rtype = (type))#define mips_elf_set_cr_dist2to(x,v)		((x).dist2to = (v))#define mips_elf_set_cr_relvaddr(x,d)		((x).relvaddr = (d)<<2)static void bfd_elf32_swap_compact_rel_out  PARAMS ((bfd *, const Elf32_compact_rel *, Elf32_External_compact_rel *));static void bfd_elf32_swap_crinfo_out  PARAMS ((bfd *, const Elf32_crinfo *, Elf32_External_crinfo *));#define USE_REL	1		/* MIPS uses REL relocations instead of RELA *//* 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)static reloc_howto_type elf_mips_howto_table[] ={  /* 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 jump 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 */	 0xffff,		/* 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 */	 true),			/* pcrel_offset */  /* 16 bit call through global offset table.  */  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 */	 0xffff,		/* 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 */    /* The remaining relocs are defined on Irix 5, although they are       not defined by the ABI.  */    EMPTY_HOWTO (13),    EMPTY_HOWTO (14),    EMPTY_HOWTO (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 */  /* A 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 */	 mips32_64bit_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.  */  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.  */  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.  */  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.  */  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.  */  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 subtraction.  Used in the N32 ABI.  */  HOWTO (R_MIPS_SUB,		/* 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_SUB",		/* name */	 true,			/* partial_inplace */	 MINUS_ONE,		/* src_mask */	 MINUS_ONE,		/* dst_mask */	 false),		/* pcrel_offset */  /* Used to cause the linker to insert and delete instructions?  */  EMPTY_HOWTO (R_MIPS_INSERT_A),  EMPTY_HOWTO (R_MIPS_INSERT_B),  EMPTY_HOWTO (R_MIPS_DELETE),  /* Get the higher value of a 64 bit addend.  */  HOWTO (R_MIPS_HIGHER,		/* 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_HIGHER",	/* name */	 true,			/* partial_inplace */	 0,			/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* Get the highest value of a 64 bit addend.  */  HOWTO (R_MIPS_HIGHEST,	/* 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_HIGHEST",	/* name */	 true,			/* partial_inplace */	 0,			/* src_mask */	 0xffff,		/* dst_mask */	 false),		/* pcrel_offset */  /* High 16 bits of displacement in global offset table.  */  HOWTO (R_MIPS_CALL_HI16,	/* type */	 0,			/* rightshift */

⌨️ 快捷键说明

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