nlm32-ppc.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,046 行 · 第 1/3 页

C
1,046
字号
	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_RL",                /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Load address.  */  HOWTO (0xd,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_RLA",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  { 0xe },  /* Non-relocating reference.  */  HOWTO (0xf,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 32,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_REF",               /* name */	 false,	                /* partial_inplace */	 0,		        /* src_mask */	 0,     	   	/* dst_mask */	 false),                /* pcrel_offset */  { 0x10 },  { 0x11 },  /* TOC relative indirect load.  */  HOWTO (0x12,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_TRL",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* TOC relative load address.  */  HOWTO (0x13,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_TRLA",              /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable relative branch.  */  HOWTO (0x14,	                /* type */	 1,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 32,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_RRTBI",             /* name */	 true,	                /* partial_inplace */	 0xffffffff,	        /* src_mask */	 0xffffffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable absolute branch.  */  HOWTO (0x15,	                /* type */	 1,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 32,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_RRTBA",             /* name */	 true,	                /* partial_inplace */	 0xffffffff,	        /* src_mask */	 0xffffffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable call absolute indirect.  */  HOWTO (0x16,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_CAI",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable call relative.  */  HOWTO (0x17,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_REL",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable branch absolute.  */  HOWTO (0x18,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_RBA",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable branch absolute.  */  HOWTO (0x19,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_RBAC",              /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable branch relative.  */  HOWTO (0x1a,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 26,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_signed, /* complain_on_overflow */	 0,		        /* special_function */	 "R_REL",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false),                /* pcrel_offset */  /* Modifiable branch absolute.  */  HOWTO (0x1b,	                /* type */	 0,	                /* rightshift */	 2,	                /* size (0 = byte, 1 = short, 2 = long) */	 16,	                /* bitsize */	 false,	                /* pc_relative */	 0,	                /* bitpos */	 complain_overflow_bitfield, /* complain_on_overflow */	 0,		        /* special_function */	 "R_REL",               /* name */	 true,	                /* partial_inplace */	 0xffff,	        /* src_mask */	 0xffff,        	/* dst_mask */	 false)                 /* pcrel_offset */};#define HOWTO_COUNT (sizeof nlm_powerpc_howto_table		\		     / sizeof nlm_powerpc_howto_table[0])/* Read a PowerPC NLM reloc.  */static booleannlm_powerpc_read_reloc (abfd, sym, secp, rel)     bfd *abfd;     nlmNAME(symbol_type) *sym;     asection **secp;     arelent *rel;{  struct nlm32_powerpc_external_reloc ext;  bfd_vma l_vaddr;  unsigned long l_symndx;  int l_rtype;  int l_rsecnm;  asection *code_sec, *data_sec, *bss_sec;  /* Read the reloc from the file.  */  if (bfd_read (&ext, sizeof ext, 1, abfd) != sizeof ext)    return false;  /* Swap in the fields.  */  l_vaddr = bfd_h_get_32 (abfd, ext.l_vaddr);  l_symndx = bfd_h_get_32 (abfd, ext.l_symndx);  l_rtype = bfd_h_get_16 (abfd, ext.l_rtype);  l_rsecnm = bfd_h_get_16 (abfd, ext.l_rsecnm);  /* Get the sections now, for convenience.  */  code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);  data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);  bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME);  /* Work out the arelent fields.  */  if (sym != NULL)    {      /* This is an import.  sym_ptr_ptr is filled in by	 nlm_canonicalize_reloc.  */      rel->sym_ptr_ptr = NULL;    }  else    {      asection *sec;      if (l_symndx == 0)	sec = code_sec;      else if (l_symndx == 1)	sec = data_sec;      else if (l_symndx == 2)	sec = bss_sec;      else	{	  bfd_set_error (bfd_error_bad_value);	  return false;	}      rel->sym_ptr_ptr = sec->symbol_ptr_ptr;    }  rel->addend = 0;  BFD_ASSERT ((l_rtype & 0xff) < HOWTO_COUNT);  rel->howto = nlm_powerpc_howto_table + (l_rtype & 0xff);  BFD_ASSERT (rel->howto->name != NULL	      && ((l_rtype & 0x8000) != 0		  ? (rel->howto->complain_on_overflow		     == complain_overflow_signed)		  : (rel->howto->complain_on_overflow		     == complain_overflow_bitfield))	      && ((l_rtype >> 8) & 0x1f) == rel->howto->bitsize - 1);  if (l_rsecnm == 0)    *secp = code_sec;  else if (l_rsecnm == 1)    {      *secp = data_sec;      l_vaddr -= bfd_section_size (abfd, code_sec);    }  else    {      bfd_set_error (bfd_error_bad_value);      return false;    }  rel->address = l_vaddr;  return true;}#endif /* OLDFORMAT *//* Mangle PowerPC NLM relocs for output.  */static booleannlm_powerpc_mangle_relocs (abfd, sec, data, offset, count)     bfd *abfd ATTRIBUTE_UNUSED;     asection *sec ATTRIBUTE_UNUSED;     PTR data ATTRIBUTE_UNUSED;     bfd_vma offset ATTRIBUTE_UNUSED;     bfd_size_type count ATTRIBUTE_UNUSED;{  return true;}/* Read a PowerPC NLM import record */static booleannlm_powerpc_read_import (abfd, sym)     bfd *abfd;     nlmNAME(symbol_type) *sym;{  struct nlm_relent *nlm_relocs;	/* relocation records for symbol */  bfd_size_type rcount;			/* number of relocs */  bfd_byte temp[NLM_TARGET_LONG_SIZE];	/* temporary 32-bit value */  unsigned char symlength;		/* length of symbol name */  char *name;  if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd)      != sizeof (symlength))    return (false);  sym -> symbol.the_bfd = abfd;  name = bfd_alloc (abfd, symlength + 1);  if (name == NULL)    return false;  if (bfd_read (name, symlength, 1, abfd) != symlength)    return (false);  name[symlength] = '\0';  sym -> symbol.name = name;  sym -> symbol.flags = 0;  sym -> symbol.value = 0;  sym -> symbol.section = bfd_und_section_ptr;  if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp))    return (false);  rcount = bfd_h_get_32 (abfd, temp);  nlm_relocs = ((struct nlm_relent *)		bfd_alloc (abfd, rcount * sizeof (struct nlm_relent)));  if (nlm_relocs == (struct nlm_relent *) NULL)    return false;  sym -> relocs = nlm_relocs;  sym -> rcnt = 0;  while (sym -> rcnt < rcount)    {      asection *section;      if (nlm_powerpc_read_reloc (abfd, sym, &section,				  &nlm_relocs -> reloc)	  == false)	return false;      nlm_relocs -> section = section;      nlm_relocs++;      sym -> rcnt++;    }

⌨️ 快捷键说明

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