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

📄 elf64-mips.c

📁 基于4个mips核的noc设计
💻 C
📖 第 1 页 / 共 5 页
字号:
  rela_hdr = &elf_section_data (sec)->rel_hdr;  rela_hdr->sh_size = rela_hdr->sh_entsize * count;  rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);  if (rela_hdr->contents == NULL)    {      *failedp = true;      return;    }  ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;  for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)    {      arelent *ptr;      Elf64_Mips_Internal_Rela int_rela;      asymbol *sym;      int n;      unsigned int i;      ptr = sec->orelocation[idx];      /* The address of an ELF reloc is section relative for an object	 file, and absolute for an executable file or shared library.	 The address of a BFD reloc is always section relative.  */      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)	int_rela.r_offset = ptr->address;      else	int_rela.r_offset = ptr->address + sec->vma;      sym = *ptr->sym_ptr_ptr;      if (sym == last_sym)	n = last_sym_idx;      else	{	  last_sym = sym;	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);	  if (n < 0)	    {	      *failedp = true;	      return;	    }	  last_sym_idx = n;	}      int_rela.r_sym = n;      int_rela.r_addend = ptr->addend;      int_rela.r_ssym = RSS_UNDEF;      if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec	  && ! _bfd_elf_validate_reloc (abfd, ptr))	{	  *failedp = true;	  return;	}      int_rela.r_type = ptr->howto->type;      int_rela.r_type2 = (int) R_MIPS_NONE;      int_rela.r_type3 = (int) R_MIPS_NONE;      for (i = 0; i < 2; i++)	{	  arelent *r;	  if (idx + 1 >= sec->reloc_count)	    break;	  r = sec->orelocation[idx + 1];	  if (r->address != ptr->address	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)	      || (*r->sym_ptr_ptr)->value != 0)	    break;	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */	  if (i == 0)	    int_rela.r_type2 = r->howto->type;	  else	    int_rela.r_type3 = r->howto->type;	  ++idx;	}      mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);    }  BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents	      == count);}/* Irix 6 defines a brand new archive map format, so that they can   have archives more than 4 GB in size.  *//* Read an Irix 6 armap.  */static booleanmips_elf64_slurp_armap (abfd)     bfd *abfd;{  struct artdata *ardata = bfd_ardata (abfd);  char nextname[17];  file_ptr arhdrpos;  bfd_size_type i, parsed_size, nsymz, stringsize, carsym_size, ptrsize;  struct areltdata *mapdata;  bfd_byte int_buf[8];  char *stringbase;  bfd_byte *raw_armap = NULL;  carsym *carsyms;  ardata->symdefs = NULL;  /* Get the name of the first element.  */  arhdrpos = bfd_tell (abfd);  i = bfd_read ((PTR) nextname, 1, 16, abfd);  if (i == 0)    return true;  if (i != 16)    return false;  if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0)    return false;  /* Archives with traditional armaps are still permitted.  */  if (strncmp (nextname, "/               ", 16) == 0)    return bfd_slurp_armap (abfd);  if (strncmp (nextname, "/SYM64/         ", 16) != 0)    {      bfd_has_map (abfd) = false;      return true;    }  mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);  if (mapdata == NULL)    return false;  parsed_size = mapdata->parsed_size;  bfd_release (abfd, (PTR) mapdata);  if (bfd_read (int_buf, 1, 8, abfd) != 8)    {      if (bfd_get_error () != bfd_error_system_call)	bfd_set_error (bfd_error_malformed_archive);      return false;    }  nsymz = bfd_getb64 (int_buf);  stringsize = parsed_size - 8 * nsymz - 8;  carsym_size = nsymz * sizeof (carsym);  ptrsize = 8 * nsymz;  ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);  if (ardata->symdefs == NULL)    return false;  carsyms = ardata->symdefs;  stringbase = ((char *) ardata->symdefs) + carsym_size;  raw_armap = (bfd_byte *) bfd_alloc (abfd, ptrsize);  if (raw_armap == NULL)    goto error_return;  if (bfd_read (raw_armap, 1, ptrsize, abfd) != ptrsize      || bfd_read (stringbase, 1, stringsize, abfd) != stringsize)    {      if (bfd_get_error () != bfd_error_system_call)	bfd_set_error (bfd_error_malformed_archive);      goto error_return;    }  for (i = 0; i < nsymz; i++)    {      carsyms->file_offset = bfd_getb64 (raw_armap + i * 8);      carsyms->name = stringbase;      stringbase += strlen (stringbase) + 1;      ++carsyms;    }  *stringbase = '\0';  ardata->symdef_count = nsymz;  ardata->first_file_filepos = arhdrpos + sizeof (struct ar_hdr) + parsed_size;  bfd_has_map (abfd) = true;  bfd_release (abfd, raw_armap);  return true; error_return:  if (raw_armap != NULL)    bfd_release (abfd, raw_armap);  if (ardata->symdefs != NULL)    bfd_release (abfd, ardata->symdefs);  return false;}/* Write out an Irix 6 armap.  The Irix 6 tools are supposed to be   able to handle ordinary ELF armaps, but at least on Irix 6.2 the   linker crashes.  */static booleanmips_elf64_write_armap (arch, elength, map, symbol_count, stridx)     bfd *arch;     unsigned int elength;     struct orl *map;     unsigned int symbol_count;     int stridx;{  unsigned int ranlibsize = (symbol_count * 8) + 8;  unsigned int stringsize = stridx;  unsigned int mapsize = stringsize + ranlibsize;  file_ptr archive_member_file_ptr;  bfd *current = arch->archive_head;  unsigned int count;  struct ar_hdr hdr;  unsigned int i;  int padding;  bfd_byte buf[8];  padding = BFD_ALIGN (mapsize, 8) - mapsize;  mapsize += padding;  /* work out where the first object file will go in the archive */  archive_member_file_ptr = (mapsize			     + elength			     + sizeof (struct ar_hdr)			     + SARMAG);  memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));  strcpy (hdr.ar_name, "/SYM64/");  sprintf (hdr.ar_size, "%-10d", (int) mapsize);  sprintf (hdr.ar_date, "%ld", (long) time (NULL));  /* This, at least, is what Intel coff sets the values to.: */  sprintf ((hdr.ar_uid), "%d", 0);  sprintf ((hdr.ar_gid), "%d", 0);  sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0);  strncpy (hdr.ar_fmag, ARFMAG, 2);  for (i = 0; i < sizeof (struct ar_hdr); i++)    if (((char *) (&hdr))[i] == '\0')      (((char *) (&hdr))[i]) = ' ';  /* Write the ar header for this item and the number of symbols */  if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), arch)      != sizeof (struct ar_hdr))    return false;  bfd_putb64 (symbol_count, buf);  if (bfd_write (buf, 1, 8, arch) != 8)    return false;  /* Two passes, first write the file offsets for each symbol -     remembering that each offset is on a two byte boundary.  */  /* Write out the file offset for the file associated with each     symbol, and remember to keep the offsets padded out.  */  current = arch->archive_head;  count = 0;  while (current != (bfd *) NULL && count < symbol_count)    {      /* For each symbol which is used defined in this object, write out	 the object file's address in the archive */      while (((bfd *) (map[count]).pos) == current)	{	  bfd_putb64 (archive_member_file_ptr, buf);	  if (bfd_write (buf, 1, 8, arch) != 8)	    return false;	  count++;	}      /* Add size of this archive entry */      archive_member_file_ptr += (arelt_size (current)				  + sizeof (struct ar_hdr));      /* remember about the even alignment */      archive_member_file_ptr += archive_member_file_ptr % 2;      current = current->next;    }  /* now write the strings themselves */  for (count = 0; count < symbol_count; count++)    {      size_t len = strlen (*map[count].name) + 1;      if (bfd_write (*map[count].name, 1, len, arch) != len)	return false;    }  /* The spec says that this should be padded to an 8 byte boundary.     However, the Irix 6.2 tools do not appear to do this.  */  while (padding != 0)    {      if (bfd_write ("", 1, 1, arch) != 1)	return false;      --padding;    }  return true;}/* ECOFF swapping routines.  These are used when dealing with the   .mdebug section, which is in the ECOFF debugging format.  */static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap ={  /* Symbol table magic number.  */  magicSym2,  /* Alignment of debugging information.  E.g., 4.  */  8,  /* Sizes of external symbolic information.  */  sizeof (struct hdr_ext),  sizeof (struct dnr_ext),  sizeof (struct pdr_ext),  sizeof (struct sym_ext),  sizeof (struct opt_ext),  sizeof (struct fdr_ext),  sizeof (struct rfd_ext),  sizeof (struct ext_ext),  /* Functions to swap in external symbolic data.  */  ecoff_swap_hdr_in,  ecoff_swap_dnr_in,  ecoff_swap_pdr_in,  ecoff_swap_sym_in,  ecoff_swap_opt_in,  ecoff_swap_fdr_in,  ecoff_swap_rfd_in,  ecoff_swap_ext_in,  _bfd_ecoff_swap_tir_in,  _bfd_ecoff_swap_rndx_in,  /* Functions to swap out external symbolic data.  */  ecoff_swap_hdr_out,  ecoff_swap_dnr_out,  ecoff_swap_pdr_out,  ecoff_swap_sym_out,  ecoff_swap_opt_out,  ecoff_swap_fdr_out,  ecoff_swap_rfd_out,  ecoff_swap_ext_out,  _bfd_ecoff_swap_tir_out,  _bfd_ecoff_swap_rndx_out,  /* Function to read in symbolic data.  */  _bfd_mips_elf_read_ecoff_info};/* Relocations in the 64 bit MIPS ELF ABI are more complex than in   standard ELF.  This structure is used to redirect the relocation   handling routines.  */const struct elf_size_info mips_elf64_size_info ={  sizeof (Elf64_External_Ehdr),  sizeof (Elf64_External_Phdr),  sizeof (Elf64_External_Shdr),  sizeof (Elf64_Mips_External_Rel),  sizeof (Elf64_Mips_External_Rela),  sizeof (Elf64_External_Sym),  sizeof (Elf64_External_Dyn),  sizeof (Elf_External_Note),  4,            /* hash-table entry size */  3,            /* internal relocations per external relocations */  64,		/* arch_size */  8,		/* file_align */  ELFCLASS64,  EV_CURRENT,  bfd_elf64_write_out_phdrs,  bfd_elf64_write_shdrs_and_ehdr,  mips_elf64_write_relocs,  bfd_elf64_swap_symbol_out,  mips_elf64_slurp_reloc_table,  bfd_elf64_slurp_symbol_table,  bfd_elf64_swap_dyn_in,  bfd_elf64_swap_dyn_out,  mips_elf64_be_swap_reloc_in,  mips_elf64_be_swap_reloc_out,  mips_elf64_be_swap_reloca_in,  mips_elf64_be_swap_reloca_out};#define TARGET_LITTLE_SYM		bfd_elf64_littlemips_vec#define TARGET_LITTLE_NAME		"elf64-littlemips"#define TARGET_BIG_SYM			bfd_elf64_bigmips_vec#define TARGET_BIG_NAME			"elf64-bigmips"#define ELF_ARCH			bfd_arch_mips#define ELF_MACHINE_CODE		EM_MIPS#define ELF_MAXPAGESIZE			0x1000#define elf_backend_collect		true#define elf_backend_type_change_ok	true#define elf_backend_can_gc_sections	true#define elf_backend_size_info		mips_elf64_size_info#define elf_backend_object_p		_bfd_mips_elf_object_p#define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr#define elf_backend_fake_sections	_bfd_mips_elf_fake_sections#define elf_backend_section_from_bfd_section \					_bfd_mips_elf_section_from_bfd_section#define elf_backend_section_processing	_bfd_mips_elf_section_processing#define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing#define elf_backend_additional_program_headers \					_bfd_mips_elf_additional_program_headers#define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map#define elf_backend_final_write_processing \					_bfd_mips_elf_final_write_processing#define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap#define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook#define elf_backend_create_dynamic_sections \					_bfd_mips_elf_create_dynamic_sections#define elf_backend_check_relocs	_bfd_mips_elf_check_relocs#define elf_backend_adjust_dynamic_symbol \					_bfd_mips_elf_adjust_dynamic_symbol#define elf_backend_always_size_sections \					_bfd_mips_elf_always_size_sections#define elf_backend_size_dynamic_sections \					_bfd_mips_elf_size_dynamic_sections#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section#define elf_backend_link_output_symbol_hook \					_bfd_mips_elf_link_output_symbol_hook#define elf_backend_finish_dynamic_symbol \					_bfd_mips_elf_finish_dynamic_symbol#define elf_backend_finish_dynamic_sections \					_bfd_mips_elf_finish_dynamic_sections#define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook#define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook#define elf_backend_got_header_size	(4*MIPS_RESERVED_GOTNO)#define elf_backend_plt_header_size	0#define elf_backend_may_use_rel_p       1/* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit   MIPS-specific function only applies to IRIX5, which had no 64-bit   ABI.  */#define bfd_elf64_find_nearest_line	_bf

⌨️ 快捷键说明

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