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

📄 loadelflib.c

📁 vxworks源码源码解读是学习vxworks的最佳途径
💻 C
📖 第 1 页 / 共 5 页
字号:
/* loadElfLib.c - UNIX elf object module loader *//* Copyright 1995-1997 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01j,30nov98,dbt  no longer clear seg.flags<xxx> after loadSegmentAllocate()                 call. (SPR #23553).01i,05oct98,pcn  Initialize all the fields in the SEG_INFO structure.01h,16sep98,pcn  Set to _ALLOC_ALIGN_SIZE the flags field in seg structure                 (SPR #21836).01g,17jul98,pcn  Fixed SPR #21836: alignment mismatch between sections and                 target.01f,18apr97,kkk  fixed printing of debug msgs for MIPS (spr# 8276)01e,05dec96,dbt  fixed a bug in loadElfSizeGet() when loading an object file                 with a data section null and a text and bss sections not                 null.01d,31oct96,elp  Replaced symAdd() call by symSAdd() call (symtbls synchro).01c,22oct96,dbt  Zero out bss section (fixed SPR #7376).01c,02oct96,dbt  Added support for SIMSPARCSOLARIS.01b,02oct96,dbt Unknown moduleformats are now correctly managed (SPR #7263).01b,03aug96,kkk throw away __gnu_compiled_c signatures.01a,20jun96,dbt	created from /host/src/tgtsvr/server/loadelf.c v01t		and /host/src/tgtsvr/server/elfppc.c v01e		and /host/src/tgtsvr/server/elfmips.c v01c*//*DESCRIPTIONThis library provides an object module loading facility.  Any SYSV elfformat files may be loaded into memory, relocated properly, theirexternal references resolved, and their external definitions added tothe system symbol table for use by other modules and from the shell.Modules may be loaded from any I/O stream.EXAMPLE.CS    fdX = open ("/devX/objFile", O_RDONLY);    loadModule (fdX, ALL_SYMBOLS);    close (fdX);.CEThis code fragment would load the ELF file "objFile" located ondevice "/devX/" into memory which would be allocated from the systemmemory pool.  All external and static definitions from the file would beadded to the system symbol table.This could also have been accomplished from the shell, by typing:.CS    -> ld (1) </devX/objFile.CEINCLUDE FILE: loadElfLib.hSEE ALSO: loadLib, usrLib, symLib, memLib,.pG "Basic OS"*//* defines */#undef INCLUDE_SDA		/* SDA is not supported for the moment */#define _CACHE_SUPPORT         	/* cache           *//* includes */#include "vxWorks.h"#include "stdio.h"#include "loadElfLib.h"#include "elf.h"#include "elftypes.h"#include "ioLib.h"#include "fioLib.h"#include "bootLoadLib.h"#include "loadLib.h"#include "memLib.h"#include "pathLib.h"#include "string.h"#include "symLib.h"#include "sysSymTbl.h"#ifdef  _CACHE_SUPPORT#include "cacheLib.h"#endif  /* _CACHE_SUPPORT */#include "errnoLib.h"#include "stdlib.h"#include "symbol.h"     /* for SYM_TYPE typedef */#include "moduleLib.h"#include "private/vmLibP.h"#if   ((CPU_FAMILY == MIPS) || (CPU_FAMILY == PPC) || (CPU_FAMILY == SIMSPARCSOLARIS))/* define */#ifndef EM_ARCH_MACHINE#define EM_ARCH_MACHINE -1              /* default */#endif /* EM_ARCH_MACHINE */#undef DEBUGG#ifdef DEBUGGint elfDebug=1;#define DSMINST(x)#define DBG(x) if (elfDebug) { printf x; fflush(stdout); }#else#define DSMINST(x)#define DBG(x)#endif /* DEBUG */#if 	(CPU == PPC403)#define ELFOUTMSBU32(b,w) \  ((b)[0] = (w >> 24), \   (b)[1] = (w >> 16), \   (b)[2] = (w >> 8), \   (b)[3]  = w)#endif /* CPU == PPC403 *//* globals *//* externals */	#ifdef INCLUDE_SDAIMPORT char SDA_BASE[];		/* Base address of SDA Area */IMPORT char SDA2_BASE[];	/* Base address of SDA2 Area */IMPORT int SDA_SIZE;		/* size of SDA area */IMPORT int SDA2_SIZE;		/* size of SDA2 area */#endif /* INCLUDE_SDA *//* locals */#ifdef INCLUDE_SDALOCAL STATUS moduleElfSegAdd (MODULE_ID moduleId, int type, void * location,    				int length, int flags, PART_ID memPartId);LOCAL BOOL segElfFindByType (SEGMENT_ID segmentId, MODULE_ID moduleId,    				int type);#endif /* INCLUDE_SDA */LOCAL UINT32 loadElfAlignGet (UINT32 alignment, void * pAddrOrSize);LOCAL int    elfRelocRelaEntryRd (int fd, int posRelocEntry, 				Elf32_Rela * pReloc);#if     (CPU_FAMILY == PPC)LOCAL STATUS elfPpcSegReloc (int fd, MODULE_ID moduleId, int loadFlag,		    		int posCurRelocCmd, Elf32_Shdr * pScnHdrTbl,			    	Elf32_Shdr * pRelHdr, SCN_ADRS * pScnAddr,	    			SYM_INFO_TBL symInfoTbl,				Elf32_Sym *  pSymsArray,			    	SYMTAB_ID    symTbl,				SEG_INFO *   pSeg);LOCAL STATUS elfPpcAddr32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl, MODULE_ID moduleId);LOCAL STATUS elfPpcAddr24Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcAddr16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcAddr16LoReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcAddr16HiReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcAddr16HaReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcAddr14Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcRel24Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcRel14Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcUaddr32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcUaddr16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcRel32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcEmbNaddr32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcEmbNaddr16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcEmbNaddr16LoReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcEmbNaddr16HiReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfPpcEmbNaddr16HaReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);#ifdef INCLUDE_SDALOCAL STATUS elfPpcSdaRel16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl, SEG_INFO * pSeg);LOCAL STATUS elfPpcEmbSda21Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl, SEG_INFO * pSeg);LOCAL STATUS elfPpcEmbSda2RelReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl, SEG_INFO * pSeg);LOCAL STATUS elfPpcEmbRelSdaReloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl, SEG_INFO * pSeg);#endif /* INCLUDE_SDA */#endif     /* CPU_FAMILY == PPC */#if	(CPU_FAMILY == MIPS)LOCAL int    elfRelocRelEntryRd (int fd, int posRelocEntry, 				Elf32_Rel * pReloc);LOCAL STATUS elfMipsSegReloc (int fd, MODULE_ID moduleId, int loadFlag,    				int posCurRelocCmd, Elf32_Shdr * pScnHdrTbl,    				Elf32_Shdr * pRelHdr, SCN_ADRS * pScnAddr,    				SYM_INFO_TBL symInfoTbl, Elf32_Sym * pSymsArray,    				SYMTAB_ID symTbl, SEG_INFO * pSeg);LOCAL STATUS relMipsSegmentRel (int fd, Elf32_Shdr * pSh, SCN_ADRS * pScnAddr, 				Elf32_Sym  * pSymsArray, int posRelocEntry,    				SYM_INFO_TBL symInfoTbl);LOCAL STATUS relMipsSegmentRela (int fd, Elf32_Shdr * pSh, SCN_ADRS * pScnAddr, 				Elf32_Sym  * pSymsArray, int posRelocEntry,    				SYM_INFO_TBL symInfoTbl);#endif	/* (CPU_FAMILY == MIPS) */#if	(CPU_FAMILY == SIMSPARCSOLARIS)LOCAL STATUS elfSparcSegReloc (int fd, MODULE_ID moduleId, int loadFlag, 			      int posCurRelocCmd, Elf32_Shdr * pScnHdrTbl,    			      Elf32_Shdr * pRelHdr, SCN_ADRS * pScnAddr,    			      SYM_INFO_TBL symInfoTbl, Elf32_Sym * pSymsArray,    			      SYMTAB_ID symTbl, SEG_INFO * pSeg);LOCAL STATUS elfSparc32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparc16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparc8Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcDisp32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd,				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcDisp16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcDisp8Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcWDisp30Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcWDisp22Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcHi22Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparc22Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparc13Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcLo10Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcPc10Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcPc22Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfSparcUa32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, 				SYM_INFO_TBL symInfoTbl);#endif	/* (CPU_FAMILY == SIMSPARCSOLARIS) */LOCAL BOOL 	loadElfModuleIsOk (Elf32_Ehdr *pHdr);LOCAL STATUS 	loadElfMdlHdrCheck (Elf32_Ehdr *pHdr);LOCAL STATUS 	loadElfMdlHdrRd (int fd, Elf32_Ehdr *pHdr);LOCAL STATUS 	loadElfProgHdrCheck (Elf32_Phdr *pProgHdr, int progHdrNum);LOCAL STATUS 	loadElfProgHdrTblRd (int fd, int posProgHdrField,				 Elf32_Phdr *pProgHdrTbl, int progHdrNumber);LOCAL STATUS 	loadElfScnHdrCheck (Elf32_Shdr *pScnHdr, int scnHdrNum);LOCAL STATUS 	loadElfScnHdrIdxDispatch (Elf32_Shdr *pScnHdrTbl, int scnHdrIdx,				IDX_TBLS *pIndexTables);LOCAL STATUS 	loadElfScnHdrRd (int fd, int posScnHdrField, 				Elf32_Shdr * pScnHdrTbl,    				int sectionNumber, IDX_TBLS * pIndexTables);LOCAL void 	loadElfSegSizeGet (char * pScnStrTbl, 				UINT32 *pLoadScnHdrIdxs, 				Elf32_Shdr *pScnHdrTbl, SEG_INFO *pSeg);LOCAL STATUS 	loadElfScnRd (int fd, char * pScnStrTbl, 				UINT32 *pLoadScnHdrIdxs, Elf32_Shdr *pScnHdrTbl,				SCN_ADRS_TBL sectionAdrsTbl, SEG_INFO *pSeg);LOCAL int	loadElfSymEntryRd (int fd, int symEntry, Elf32_Sym *pSymbol);LOCAL STATUS 	loadElfSymTabRd (int fd, int nextSym, UINT32 nSyms, 				Elf32_Sym *pSymsArray);LOCAL int 	loadElfSymTablesHandle (UINT32 *pSymTabScnHdrIdxs, 				Elf32_Shdr *pScnHdrTbl, int fd,					SYMTBL_REFS *pSymTblRefs,				SYMINFO_REFS * pSymsAdrsRefs);LOCAL SYM_TYPE 	loadElfSymTypeGet (Elf32_Sym *pSymbol, Elf32_Shdr *pScnHdrTbl, 				char * pScnStrTbl);LOCAL BOOL 	loadElfSymIsVisible (UINT32	symAssoc, UINT32 symBinding, 				int loadFlag);LOCAL STATUS 	loadElfSymTabProcess (MODULE_ID moduleId, int loadFlag, 				Elf32_Sym *pSymsArray, 				SCN_ADRS_TBL sectionAdrsTbl,				SYM_INFO_TBL symsAdrsTbl, char * pStringTable,				SYMTAB_ID symTbl, UINT32 symNumber,				Elf32_Shdr * pScnHdrTbl, char * pScnStrTbl,				SEG_INFO * pSeg);LOCAL STATUS 	loadElfSymTableBuild (MODULE_ID moduleId, int loadFlag,				SYMTBL_REFS  symTblRefs, 				SCN_ADRS_TBL sectionAdrsTbl,				SYMINFO_REFS symsAdrsRefs, 				IDX_TBLS *pIndexTables, SYMTAB_ID symTbl, 				int fd, Elf32_Shdr * pScnHdrTbl,				char * pScnStrTbl, SEG_INFO * pSeg);LOCAL FUNCPTR 	loadElfRelSegRtnGet (void);LOCAL STATUS 	loadElfSegReloc (int fd, int loadFlag, MODULE_ID moduleId, 				Elf32_Ehdr * pHdr, IDX_TBLS *pIndexTables, 				Elf32_Shdr *pScnHdrTbl,			    	SCN_ADRS_TBL sectionAdrsTbl, 				SYMTBL_REFS  symTblRefs,				SYMINFO_REFS symsAdrsRefs, SYMTAB_ID symTbl,				SEG_INFO * pSeg);LOCAL STATUS 	loadElfTablesAlloc (Elf32_Ehdr *pHdr, Elf32_Phdr **ppProgHdrTbl,				Elf32_Shdr **ppScnHdrTbl, 				IDX_TBLS *pIndexTables);LOCAL MODULE_ID loadElfFmtManage (FAST int fd, int loadFlag, void **ppText,			  	void **ppData, void **ppBss, SYMTAB_ID symTbl);LOCAL STATUS 	loadElfCommonManage (int comAreaSize, char * symName, 				SYMTAB_ID symTbl, SYM_ADRS * pSymAddr, 				SYM_TYPE *  pSymType, int loadFlag, 				SEG_INFO * pSeg, int group);LOCAL void 	loadElfBufferFree (void ** ppBuf);LOCAL STATUS 	loadElfRelocMod (SEG_INFO * pSeg, int fd, char * pScnStrTbl,				IDX_TBLS * pIndexTables, Elf32_Ehdr * pHdr,    				Elf32_Shdr * pScnHdrTbl,    				SCN_ADRS_TBL * pSectionAdrsTbl);LOCAL STATUS 	loadElfSegStore (SEG_INFO * pSeg, int loadFlag, int fd,				char * pScnStrTbl,    				IDX_TBLS * pIndexTables, Elf32_Ehdr * pHdr,    				Elf32_Shdr * pScnHdrTbl, 				Elf32_Phdr * pProgHdrTbl,    				SCN_ADRS_TBL * pSectionAdrsTbl);LOCAL char * 	loadElfScnStrTblRd (int fd, Elf32_Shdr * pScnHdrTbl, 				Elf32_Ehdr * pHdr);#ifdef INCLUDE_SDALOCAL STATUS 	loadElfSdaAllocate (SDA_INFO * pSda);LOCAL STATUS 	loadElfSdaCreate (void);LOCAL SDA_SCN_TYPE loadElfSdaScnDetermine (char * pScnStrTbl, 				Elf32_Shdr * pScnHdr, char * sectionName);LOCAL BOOL      sdaIsRequired = FALSE;  /* TRUE if SDA are used by the arch */LOCAL PART_ID   sdaMemPartId = NULL;    /* keeps SDA memory partition id */LOCAL PART_ID   sda2MemPartId = NULL;   /* keeps SDA2 memory partition id */LOCAL void *    sdaBaseAddr = NULL;     /* keeps SDA area base address */LOCAL void *    sda2BaseAddr = NULL;    /* keeps SDA2 area base address */LOCAL int     	sdaAreaSize = 0;     	/* keeps SDA area size */LOCAL int     	sda2AreaSize = 0;     	/* keeps SDA area size */#endif /* INCLUDE_SDA *//********************************************************************************* elfRelocRelaEntryRd - read in ELF relocation entry for RELA relocation* * This routine fills a relocation structure with information from the object* module in memory.** RETURNS : the address of the next relocation entry.*/LOCAL int elfRelocRelaEntryRd    (    int 	 fd,		/* file to read in */    int 	 posRelocEntry,	/* position of reloc. command in object file */    Elf32_Rela * pReloc		/* ptr on relocation structure to fill */    )    {    int nbytes;		/* number of bytes to copy */    nbytes = sizeof(Elf32_Rela);    ioctl(fd, FIOSEEK, posRelocEntry);    fioRead(fd, (char *) pReloc, nbytes);    return (posRelocEntry + nbytes);    }     #if     (CPU_FAMILY == PPC)/********************************************************************************* elfPpcSegReloc - perform relocation for the PowerPC family** This routine reads the specified relocation command segment and performs* all the relocations specified therein. Only relocation command from sections* with section type SHT_RELA are considered here.** Absolute symbol addresses are looked up in the 'externals' table.** This function handles the following types of relocation commands* for the PowerPC processor:** System V ABI:*	R_PPC_NONE		: none*	R_PPC_ADDR32		: word32,	S + A*	R_PPC_ADDR24		: low24,	(S + A) >> 2*	R_PPC_ADDR16		: half16,	S + A*	R_PPC_ADDR16_LO		: half16,	#lo(S + A)*	R_PPC_ADDR16_HI		: half16,	#hi(S + A)*	R_PPC_ADDR16_HA		: half16,	#ha(S + A)*	R_PPC_ADDR14		: low14,	(S + A) >> 2*	R_PPC_ADDR14_BRTAKEN	: low14,	(S + A) >> 2*	R_PPC_ADDR14_BRNTAKEN	: low14,	(S + A) >> 2*	R_PPC_REL24		: low24,	(S + A - P) >> 2*	R_PPC_REL14		: low14,	(S + A - P) >> 2*	R_PPC_REL14_BRTAKEN	: low14,	(S + A - P) >> 2*	R_PPC_REL14_BRNTAKEN	: low14,	(S + A - P) >> 2*	R_PPC_UADDR32		: word32,	S + A*	R_PPC_UADDR16		: half16,	S + A*	R_PPC_REL32		: word32,	S + A - P*	R_PPC_SDAREL		: half16,	S + A - SDA_BASE** PowerPC EABI:*	R_PPC_EMB_NADDR32	: uword32,	A - S*	R_PPC_EMB_NADDR16	: uhalf16,	A - S*	R_PPC_EMB_NADDR16_LO	: uhalf16,	#lo(A - S)*	R_PPC_EMB_NADDR16_HI	: uhalf16,	#hi(A - S)*	R_PPC_EMB_NADDR16_HA	: uhalf16,	#ha(A - S)*	R_PPC_EMB_MRKREF	: none*	R_PPC_EMB_SDA21		: ulow21,	complex*	R_PPC_EMB_SDA2REL	: uhalf16,	S + A - SDA2_BASE*	R_PPC_EMB_RELSDA	: uhalf16,	complex** RETURNS: OK or ERROR*/LOCAL STATUS elfPpcSegReloc    (    int		 fd,		/* file to read in */    MODULE_ID	 moduleId,	/* module id */    int		 loadFlag,	/* not used */    int	 	 posCurRelocCmd,/* position of current relocation command */    Elf32_Shdr * pScnHdrTbl,	/* not used */    Elf32_Shdr * pRelHdr,	/* pointer to relocation section header */    SCN_ADRS *	 pScnAddr,	/* section address once loaded */    SYM_INFO_TBL symInfoTbl,	/* array of absolute symbol values and types */    Elf32_Sym *	 pSymsArray,	/* pointer to symbols array */    SYMTAB_ID 	 symTbl,	/* not used */

⌨️ 快捷键说明

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