ecoffswap.h
来自「基于4个mips核的noc设计」· C头文件 代码 · 共 864 行 · 第 1/3 页
H
864 行
/* Generic ECOFF swapping routines, for BFD. Copyright 1992, 1993, 1994, 1995, 1996, 2000, 2001 Free Software Foundation, Inc. Written by Cygnus Support.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. *//* NOTE: This is a header file, but it contains executable routines. This is done this way because these routines are substantially similar, but are not identical, for all ECOFF targets. These are routines to swap the ECOFF symbolic information in and out. The routines are defined statically. You can set breakpoints on them in gdb by naming the including source file; e.g., 'coff-mips.c':ecoff_swap_hdr_in. Before including this header file, one of ECOFF_32, ECOFF_64, ECOFF_SIGNED_32 or ECOFF_SIGNED_64 must be defined. These are checked when swapping information that depends upon the target size. This code works for 32 bit and 64 bit ECOFF, but may need to be generalized in the future. Some header file which defines the external forms of these structures must also be included before including this header file. Currently this is either coff/mips.h or coff/alpha.h. If the symbol TEST is defined when this file is compiled, a comparison is made to ensure that, in fact, the output is bit-for-bit the same as the input. Of course, this symbol should only be defined when deliberately testing the code on a machine with the proper byte sex and such. */#ifdef ECOFF_32#define ecoff_get_off bfd_h_get_32#define ecoff_put_off bfd_h_put_32#endif#ifdef ECOFF_64#define ecoff_get_off bfd_h_get_64#define ecoff_put_off bfd_h_put_64#endif#ifdef ECOFF_SIGNED_32#define ecoff_get_off bfd_h_get_signed_32#define ecoff_put_off bfd_h_put_signed_32#endif#ifdef ECOFF_SIGNED_64#define ecoff_get_off bfd_h_get_signed_64#define ecoff_put_off bfd_h_put_signed_64#endif/* ECOFF auxiliary information swapping routines. These are the same for all ECOFF targets, so they are defined in ecofflink.c. */extern void _bfd_ecoff_swap_tir_in PARAMS ((int, const struct tir_ext *, TIR *));extern void _bfd_ecoff_swap_tir_out PARAMS ((int, const TIR *, struct tir_ext *));extern void _bfd_ecoff_swap_rndx_in PARAMS ((int, const struct rndx_ext *, RNDXR *));extern void _bfd_ecoff_swap_rndx_out PARAMS ((int, const RNDXR *, struct rndx_ext *));/* Prototypes for functions defined in this file. */static void ecoff_swap_hdr_in PARAMS ((bfd *, PTR, HDRR *));static void ecoff_swap_hdr_out PARAMS ((bfd *, const HDRR *, PTR));static void ecoff_swap_fdr_in PARAMS ((bfd *, PTR, FDR *));static void ecoff_swap_fdr_out PARAMS ((bfd *, const FDR *, PTR));static void ecoff_swap_pdr_in PARAMS ((bfd *, PTR, PDR *));static void ecoff_swap_pdr_out PARAMS ((bfd *, const PDR *, PTR));static void ecoff_swap_sym_in PARAMS ((bfd *, PTR, SYMR *));static void ecoff_swap_sym_out PARAMS ((bfd *, const SYMR *, PTR));static void ecoff_swap_ext_in PARAMS ((bfd *, PTR, EXTR *));static void ecoff_swap_ext_out PARAMS ((bfd *, const EXTR *, PTR));static void ecoff_swap_rfd_in PARAMS ((bfd *, PTR, RFDT *));static void ecoff_swap_rfd_out PARAMS ((bfd *, const RFDT *, PTR));static void ecoff_swap_opt_in PARAMS ((bfd *, PTR, OPTR *));static void ecoff_swap_opt_out PARAMS ((bfd *, const OPTR *, PTR));static void ecoff_swap_dnr_in PARAMS ((bfd *, PTR, DNR *));static void ecoff_swap_dnr_out PARAMS ((bfd *, const DNR *, PTR));/* Swap in the symbolic header. */static voidecoff_swap_hdr_in (abfd, ext_copy, intern) bfd *abfd; PTR ext_copy; HDRR *intern;{ struct hdr_ext ext[1]; *ext = *(struct hdr_ext *) ext_copy; intern->magic = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->h_magic); intern->vstamp = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->h_vstamp); intern->ilineMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ilineMax); intern->cbLine = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbLine); intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbLineOffset); intern->idnMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_idnMax); intern->cbDnOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbDnOffset); intern->ipdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ipdMax); intern->cbPdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbPdOffset); intern->isymMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_isymMax); intern->cbSymOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSymOffset); intern->ioptMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ioptMax); intern->cbOptOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbOptOffset); intern->iauxMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iauxMax); intern->cbAuxOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbAuxOffset); intern->issMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issMax); intern->cbSsOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSsOffset); intern->issExtMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issExtMax); intern->cbSsExtOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSsExtOffset); intern->ifdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ifdMax); intern->cbFdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbFdOffset); intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_crfd); intern->cbRfdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbRfdOffset); intern->iextMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iextMax); intern->cbExtOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbExtOffset);#ifdef TEST if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) abort ();#endif}/* Swap out the symbolic header. */static voidecoff_swap_hdr_out (abfd, intern_copy, ext_ptr) bfd *abfd; const HDRR *intern_copy; PTR ext_ptr;{ struct hdr_ext *ext = (struct hdr_ext *) ext_ptr; HDRR intern[1]; *intern = *intern_copy; bfd_h_put_signed_16 (abfd, intern->magic, (bfd_byte *)ext->h_magic); bfd_h_put_signed_16 (abfd, intern->vstamp, (bfd_byte *)ext->h_vstamp); bfd_h_put_32 (abfd, intern->ilineMax, (bfd_byte *)ext->h_ilineMax); ecoff_put_off (abfd, intern->cbLine, (bfd_byte *)ext->h_cbLine); ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->h_cbLineOffset); bfd_h_put_32 (abfd, intern->idnMax, (bfd_byte *)ext->h_idnMax); ecoff_put_off (abfd, intern->cbDnOffset, (bfd_byte *)ext->h_cbDnOffset); bfd_h_put_32 (abfd, intern->ipdMax, (bfd_byte *)ext->h_ipdMax); ecoff_put_off (abfd, intern->cbPdOffset, (bfd_byte *)ext->h_cbPdOffset); bfd_h_put_32 (abfd, intern->isymMax, (bfd_byte *)ext->h_isymMax); ecoff_put_off (abfd, intern->cbSymOffset, (bfd_byte *)ext->h_cbSymOffset); bfd_h_put_32 (abfd, intern->ioptMax, (bfd_byte *)ext->h_ioptMax); ecoff_put_off (abfd, intern->cbOptOffset, (bfd_byte *)ext->h_cbOptOffset); bfd_h_put_32 (abfd, intern->iauxMax, (bfd_byte *)ext->h_iauxMax); ecoff_put_off (abfd, intern->cbAuxOffset, (bfd_byte *)ext->h_cbAuxOffset); bfd_h_put_32 (abfd, intern->issMax, (bfd_byte *)ext->h_issMax); ecoff_put_off (abfd, intern->cbSsOffset, (bfd_byte *)ext->h_cbSsOffset); bfd_h_put_32 (abfd, intern->issExtMax, (bfd_byte *)ext->h_issExtMax); ecoff_put_off (abfd, intern->cbSsExtOffset, (bfd_byte *)ext->h_cbSsExtOffset); bfd_h_put_32 (abfd, intern->ifdMax, (bfd_byte *)ext->h_ifdMax); ecoff_put_off (abfd, intern->cbFdOffset, (bfd_byte *)ext->h_cbFdOffset); bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->h_crfd); ecoff_put_off (abfd, intern->cbRfdOffset, (bfd_byte *)ext->h_cbRfdOffset); bfd_h_put_32 (abfd, intern->iextMax, (bfd_byte *)ext->h_iextMax); ecoff_put_off (abfd, intern->cbExtOffset, (bfd_byte *)ext->h_cbExtOffset);#ifdef TEST if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) abort ();#endif}/* Swap in the file descriptor record. */static voidecoff_swap_fdr_in (abfd, ext_copy, intern) bfd *abfd; PTR ext_copy; FDR *intern;{ struct fdr_ext ext[1]; *ext = *(struct fdr_ext *) ext_copy; intern->adr = ecoff_get_off (abfd, (bfd_byte *)ext->f_adr); intern->rss = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rss);#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64) if (intern->rss == (signed long) 0xffffffff) intern->rss = -1;#endif intern->issBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_issBase); intern->cbSs = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbSs); intern->isymBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_isymBase); intern->csym = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_csym); intern->ilineBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ilineBase); intern->cline = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cline); intern->ioptBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ioptBase); intern->copt = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_copt);#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32) intern->ipdFirst = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_ipdFirst); intern->cpd = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_cpd);#endif#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64) intern->ipdFirst = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ipdFirst); intern->cpd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cpd);#endif intern->iauxBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_iauxBase); intern->caux = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_caux); intern->rfdBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rfdBase); intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_crfd); /* now the fun stuff... */ if (bfd_header_big_endian (abfd)) { intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_BIG) >> FDR_BITS1_LANG_SH_BIG; intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG); intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG); intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG); intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG) >> FDR_BITS2_GLEVEL_SH_BIG; } else { intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE) >> FDR_BITS1_LANG_SH_LITTLE; intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE); intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE); intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE); intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE) >> FDR_BITS2_GLEVEL_SH_LITTLE; } intern->reserved = 0; intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbLineOffset); intern->cbLine = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbLine);#ifdef TEST if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) abort ();#endif}/* Swap out the file descriptor record. */static voidecoff_swap_fdr_out (abfd, intern_copy, ext_ptr) bfd *abfd; const FDR *intern_copy; PTR ext_ptr;{ struct fdr_ext *ext = (struct fdr_ext *) ext_ptr; FDR intern[1]; *intern = *intern_copy; /* Make it reasonable to do in-place. */ ecoff_put_off (abfd, intern->adr, (bfd_byte *)ext->f_adr); bfd_h_put_32 (abfd, intern->rss, (bfd_byte *)ext->f_rss); bfd_h_put_32 (abfd, intern->issBase, (bfd_byte *)ext->f_issBase); ecoff_put_off (abfd, intern->cbSs, (bfd_byte *)ext->f_cbSs); bfd_h_put_32 (abfd, intern->isymBase, (bfd_byte *)ext->f_isymBase); bfd_h_put_32 (abfd, intern->csym, (bfd_byte *)ext->f_csym); bfd_h_put_32 (abfd, intern->ilineBase, (bfd_byte *)ext->f_ilineBase); bfd_h_put_32 (abfd, intern->cline, (bfd_byte *)ext->f_cline); bfd_h_put_32 (abfd, intern->ioptBase, (bfd_byte *)ext->f_ioptBase); bfd_h_put_32 (abfd, intern->copt, (bfd_byte *)ext->f_copt);#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32) bfd_h_put_16 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst); bfd_h_put_16 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd);#endif#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64) bfd_h_put_32 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst); bfd_h_put_32 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd);#endif bfd_h_put_32 (abfd, intern->iauxBase, (bfd_byte *)ext->f_iauxBase); bfd_h_put_32 (abfd, intern->caux, (bfd_byte *)ext->f_caux); bfd_h_put_32 (abfd, intern->rfdBase, (bfd_byte *)ext->f_rfdBase); bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->f_crfd); /* now the fun stuff... */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?