i386lynx.c

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

C
564
字号
/* BFD back-end for i386 a.out binaries under LynxOS.   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996   Free Software Foundation, Inc.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.  */#define BYTES_IN_WORD 4#define N_SHARED_LIB(x) 0#define TEXT_START_ADDR 0#define TARGET_PAGE_SIZE 4096#define SEGMENT_SIZE TARGET_PAGE_SIZE#define DEFAULT_ARCH bfd_arch_i386#define MY(OP) CAT(i386lynx_aout_,OP)#define TARGETNAME "a.out-i386-lynx"#include "bfd.h"#include "sysdep.h"#include "libbfd.h"#ifndef WRITE_HEADERS#define WRITE_HEADERS(abfd, execp)					      \      {									      \	bfd_size_type text_size; /* dummy vars */			      \	file_ptr text_end;						      \	if (adata(abfd).magic == undecided_magic)			      \	  NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end);     \    									      \	execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE;	      \	execp->a_entry = bfd_get_start_address (abfd);			      \    									      \	execp->a_trsize = ((obj_textsec (abfd)->reloc_count) *		      \			   obj_reloc_entry_size (abfd));		      \	execp->a_drsize = ((obj_datasec (abfd)->reloc_count) *		      \			   obj_reloc_entry_size (abfd));		      \	NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes);	      \									      \	if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) return false;	      \	if (bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)	      \	    != EXEC_BYTES_SIZE)						      \	  return false;							      \	/* Now write out reloc info, followed by syms and strings */	      \  									      \	if (bfd_get_symcount (abfd) != 0) 				      \	    {								      \	      if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET)     \		  != 0)							      \	        return false;						      \									      \	      if (! NAME(aout,write_syms)(abfd)) return false;		      \									      \	      if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET)    \		  != 0)							      \	        return false;						      \									      \	      if (!NAME(lynx,squirt_out_relocs) (abfd, obj_textsec (abfd)))   \		return false;						      \	      if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*execp)), SEEK_SET)    \		  != 0)							      \	        return 0;						      \									      \	      if (!NAME(lynx,squirt_out_relocs)(abfd, obj_datasec (abfd)))    \		return false;						      \	    }								      \      }#endif#include "libaout.h"#include "aout/aout64.h"#ifdef LYNX_COREchar *lynx_core_file_failing_command ();int lynx_core_file_failing_signal ();boolean lynx_core_file_matches_executable_p ();const bfd_target *lynx_core_file_p ();#define	MY_core_file_failing_command lynx_core_file_failing_command#define	MY_core_file_failing_signal lynx_core_file_failing_signal#define	MY_core_file_matches_executable_p lynx_core_file_matches_executable_p#define	MY_core_file_p lynx_core_file_p#endif /* LYNX_CORE */#define KEEPIT udata.iextern reloc_howto_type aout_32_ext_howto_table[];extern reloc_howto_type aout_32_std_howto_table[];/* Standard reloc stuff *//* Output standard relocation information to a file in target byte order. */voidNAME(lynx,swap_std_reloc_out) (abfd, g, natptr)     bfd *abfd;     arelent *g;     struct reloc_std_external *natptr;{  int r_index;  asymbol *sym = *(g->sym_ptr_ptr);  int r_extern;  unsigned int r_length;  int r_pcrel;  int r_baserel, r_jmptable, r_relative;  unsigned int r_addend;  asection *output_section = sym->section->output_section;  PUT_WORD (abfd, g->address, natptr->r_address);  r_length = g->howto->size;	/* Size as a power of two */  r_pcrel = (int) g->howto->pc_relative;	/* Relative to PC? */  /* r_baserel, r_jmptable, r_relative???  FIXME-soon */  r_baserel = 0;  r_jmptable = 0;  r_relative = 0;  r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;  /* name was clobbered by aout_write_syms to be symbol index */  /* If this relocation is relative to a symbol then set the     r_index to the symbols index, and the r_extern bit.     Absolute symbols can come in in two ways, either as an offset     from the abs section, or as a symbol which has an abs value.     check for that here     */  if (bfd_is_com_section (output_section)      || bfd_is_abs_section (output_section)      || bfd_is_und_section (output_section))    {      if (bfd_abs_section_ptr->symbol == sym)	{	  /* Whoops, looked like an abs symbol, but is really an offset	   from the abs section */	  r_index = 0;	  r_extern = 0;	}      else	{	  /* Fill in symbol */	  r_extern = 1;	  r_index = (*g->sym_ptr_ptr)->KEEPIT;	}    }  else    {      /* Just an ordinary section */      r_extern = 0;      r_index = output_section->target_index;    }  /* now the fun stuff */  if (bfd_header_big_endian (abfd))    {      natptr->r_index[0] = r_index >> 16;      natptr->r_index[1] = r_index >> 8;      natptr->r_index[2] = r_index;      natptr->r_type[0] =	(r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0)	| (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0)	| (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0)	| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)	| (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)	| (r_length << RELOC_STD_BITS_LENGTH_SH_BIG);    }  else    {      natptr->r_index[2] = r_index >> 16;      natptr->r_index[1] = r_index >> 8;      natptr->r_index[0] = r_index;      natptr->r_type[0] =	(r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0)	| (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0)	| (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0)	| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)	| (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)	| (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE);    }}/* Extended stuff *//* Output extended relocation information to a file in target byte order. */voidNAME(lynx,swap_ext_reloc_out) (abfd, g, natptr)     bfd *abfd;     arelent *g;     register struct reloc_ext_external *natptr;{  int r_index;  int r_extern;  unsigned int r_type;  unsigned int r_addend;  asymbol *sym = *(g->sym_ptr_ptr);  asection *output_section = sym->section->output_section;  PUT_WORD (abfd, g->address, natptr->r_address);  r_type = (unsigned int) g->howto->type;  r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;  /* If this relocation is relative to a symbol then set the     r_index to the symbols index, and the r_extern bit.     Absolute symbols can come in in two ways, either as an offset     from the abs section, or as a symbol which has an abs value.     check for that here     */  if (bfd_is_com_section (output_section)      || bfd_is_abs_section (output_section)      || bfd_is_und_section (output_section))    {      if (bfd_abs_section_ptr->symbol == sym)	{	  /* Whoops, looked like an abs symbol, but is really an offset	 from the abs section */	  r_index = 0;	  r_extern = 0;	}      else	{	  r_extern = 1;	  r_index = (*g->sym_ptr_ptr)->KEEPIT;	}    }  else    {      /* Just an ordinary section */      r_extern = 0;      r_index = output_section->target_index;    }  /* now the fun stuff */  if (bfd_header_big_endian (abfd))    {      natptr->r_index[0] = r_index >> 16;      natptr->r_index[1] = r_index >> 8;      natptr->r_index[2] = r_index;      natptr->r_type[0] =	(r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0)	| (r_type << RELOC_EXT_BITS_TYPE_SH_BIG);    }  else    {      natptr->r_index[2] = r_index >> 16;      natptr->r_index[1] = r_index >> 8;      natptr->r_index[0] = r_index;      natptr->r_type[0] =	(r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0)	| (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE);    }  PUT_WORD (abfd, r_addend, natptr->r_addend);}/* BFD deals internally with all things based from the section they're   in. so, something in 10 bytes into a text section  with a base of   50 would have a symbol (.text+10) and know .text vma was 50.

⌨️ 快捷键说明

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