📄 loadelflib.c
字号:
/* loadElfLib.c - UNIX elf object module loader *//* Copyright 1996-2002 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01x,09may02,fmk use loadCommonManage() instead of loadElfCommonManage()01w,23apr02,jn SPR 75177 - correct inaccurate test for whether CPU is SIMSPARCSOLARIS 01v,26mar02,jn fix alignment handling for COMMON's (SPR 74567)01u,07mar02,jn Add STT_ARM_16BIT to recognized types (SPR # 73992)01t,07mar02,jn Refix SPR# 30588 - load should return NULL when there are unresolved symbols.01s,14jan02,jn Improve comments about setting SYM_THUMB01r,25jan02,rec Merge in coldfire changes01q,12dec01,pad Moved MIPS support code out in the ELF/MIPS relocation unit.01p,28nov01,jn Fix alignment of segments (SPR #28353). Also removed declarations of unsupported relocation types for SH.01o,19nov01,pch Provide misalignment prevention based on _WRS_STRICT_ALIGNMENT definition instead of testing a specific CPU type.01n,08nov01,jn Added support for ARM/THUMB architecture now using ELF01m,17sep01,pad Introduced usage of relocation unit's init routines. Added support for I86 relocation unit. Symbols from a read-only data sections are now flagged as data, like in VxWorks AE, rather than text. Made the determination of text sections more flexible in loadElfSegSizeGet().01l,28jun01,agf add logic to MIPS that tests for attempted relative jumps across a 26 bit boundary01k,03mar00,zl merged SH support from T101j,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) || (CPU_FAMILY == SH) || \ (CPU_FAMILY == I80X86) || (CPU_FAMILY == ARM) || \ (CPU_FAMILY==COLDFIRE))/* 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 */#ifdef _WRS_STRICT_ALIGNMENT#define ELFOUTMSBU32(b,w) \ ((b)[0] = (w >> 24), \ (b)[1] = (w >> 16), \ (b)[2] = (w >> 8), \ (b)[3] = w)#endif /* _WRS_STRICT_ALIGNMENT *//* 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 BOOL (* pElfModuleVerifyRtn) (UINT32 machType, BOOL * sda) = NULL; /* verif rtn ptr */LOCAL STATUS (* pElfSegRelRtn) (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) = NULL; /* seg reloc rtn ptr */#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 == 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) */#if (CPU_FAMILY == COLDFIRE)LOCAL STATUS elfM68k32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfM68k16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfM68kDisp32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfM68kDisp16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfM68kSegReloc (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);#endif /* (CPU_FAMILY == COLDFIRE) */#if (CPU_FAMILY == SH)LOCAL STATUS elfShSegReloc (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 elfShDir32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl, MODULE_ID moduleId);#if FALSE /* Relocation types not currently supported. */LOCAL STATUS elfShRel32Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfShDir8wpnReloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfShInd12wReloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfShDir8wplReloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfShDir8bpReloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);LOCAL STATUS elfShSwitch16Reloc (void * pAdrs, Elf32_Rela * pRelocCmd, SYM_INFO_TBL symInfoTbl);#endif /* relocation types not currently supported. */#endif /* (CPU_FAMILY == SH) */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 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 or ERROR if entry not read.*/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); if ((ioctl (fd, FIOSEEK, posRelocEntry)) == ERROR) return ERROR; if ((fioRead (fd, (char *) pReloc, nbytes)) == ERROR) return ERROR; return (posRelocEntry + nbytes);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -