📄 loadelflib.c
字号:
/* 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 + -