diff -r c7c26511138f -r 360bd6b35136 bintools/elftools/inc/elfdll.h --- a/bintools/elftools/inc/elfdll.h Wed Jun 16 16:51:40 2010 +0300 +++ b/bintools/elftools/inc/elfdll.h Wed Jun 23 16:56:47 2010 +0800 @@ -1,254 +1,254 @@ -/* -* Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - - -#if !defined(__ELFDLL_H__) -#define __ELFDLL_H__ -//#include -#include "e32ldfmt.h" -#include -#include "elffile.h" - -#define DLLSYMPREFIX "#" -#define DLLSYMPREFIX0 "#" -#define DLLSYMSUFFIX "#<\\DLL>" -#define ORDBASE 16 -#define EXPORTTABLENAME "DLL##ExportTable" -#define EXPORTTABLESIZENAME "DLL##ExportTableSize" - -class NamedExportSymbol; -class OrdZeroRecord; -struct NeededDLLsList; - -const TUint KNameLookupOffsetFlag32 = 0x0001; - -class ELFFile::ELFDllData - { -public: - ELFFile * iElfFile; - - char * iDynStrTab; - // bytesize of the dynamic string table - TInt iDynStrTabSize; - Elf32_Sym * iDynSymTab; - // size of an entry in the dynamic symbol table - TInt iSymSize; - // the rela relocation table - Elf32_Rela * iRela; - // size of rela relocation table in bytes - TInt iRelaSz; - // size of a rela entry in bytes - TInt iRelaEnt; - // the rel relocation table - Elf32_Rel * iRel; - // size of rel relocation table in bytes - TInt iRelSz; - // size of a rel entry in bytes - TInt iRelEnt; - - Elf32_HashTable * iHashTable; - - // Exported symbols required for lookup via names. - NamedExportSymbol *iNamedExportSymbolHead; - // Number of exported symbols - this doesn't nclude the absent symbols. - TInt iNamedExportCount; - // header of the export symbol info table - E32EpocExpSymInfoHdr iSymInfoHdr; - // String table size for the symbol names. - TUint iSymStringTableSize; - TUint iStringNameOffset; - - // Dependency list - // Static Dependencies - An 'import relocation' entry is required to be created - // for each such record. - OrdZeroRecord *iDepRecords; - OrdZeroRecord *iDepRecordsTail; - - // List of names obtained from DT_NEEDED entries in ELF. - // The order in which they appear is the order in which symbol - // lookup shall be followed. - NeededDLLsList *iNeededDllNames; - NeededDLLsList *iNeededDllNamesTail; - // Ordinal 0 of this binary. - A local relocation needs to be created for this - // record. - - OrdZeroRecord *iOrdZeroRec; - TInt iNamedLookupEnabled; - - ELFDllData(ELFFile * f); - ~ELFDllData(); - TBool Init(); - - TBool ParseDllSymbol(Elf32_Sym * s, char*& dll, TUint& len, TInt& ord); - class DllSymbol - { - public: - char * iDll; - TUint iLen; - TInt iOrd; - Elf32_Phdr * iSegment; - Elf32_Rel * iRel; - DllSymbol * iNext; - - DllSymbol(char * n, TUint l, TInt o) - : iDll(n), iLen(l), iOrd(o), iSegment(0),iRel(0),iNext(0) - {} - ~DllSymbol() - { - delete iNext; - } - }; - DllSymbol * DllSymbolP(Elf32_Sym * s); - TBool AddSymbol(DllSymbol * s); - - class DllRec - { - public: - char * iName; - TUint iLen; - TInt nImports; - DllSymbol * iHead; - DllSymbol * iTail; - DllRec * iNext; - - DllRec(char * n, TInt l, DllSymbol * s) : - iName(n), iLen(l), nImports(1), iHead(s), iTail(s), iNext(0) - {} - ~DllRec() - { - delete iHead; - delete iNext; - } - void AddSymbol(DllSymbol * s); - }; - - DllRec * iDllHead; - DllRec * iDllTail; - - Elf32_Word iExportTableSymIdx; - Elf32_Word iExportTableSizeSymIdx; - - TBool InitExportInfo(); - TBool iImageIsDll; - TBool ImageIsDll() { return iImageIsDll; } - - Elf32_Word FindSymbolIndex(TText * s); - - TInt iNumberOfImports; - TInt iNumberOfExports; - TInt iNumberOfImportDlls; - - TInt iStringTableSize; - - TInt iNumberOfRelocs; - TInt iNumberOfCodeRelocs; - TInt iNumberOfDataRelocs; - - TInt NumberOfImports(void); - TInt NumberOfExports(void); - TInt NumberOfImportDlls(void); - - TInt NumberOfRelocs(void); - - TInt NumberOfCodeRelocs() { return iNumberOfCodeRelocs; } - TInt NumberOfDataRelocs() { return iNumberOfDataRelocs; } - - TBool GetRelocs(Elf32_Rel **aCodeRelocs, Elf32_Rel **aDataRelocs); - - TUint GetExportTableOffset(void); - char * CreateImportSection(TInt &aSize); - TBool CreateSymLookupTable(); - TBool SetupSymbolValues(); - TBool SetupSymbolNames(); - void Sort(NamedExportSymbol** aDstList, NamedExportSymbol* aSrcList); - void MergeSort(NamedExportSymbol** aDstList, NamedExportSymbol** aSrcList); - void MergeSort(NamedExportSymbol** aDstList, NamedExportSymbol** aSrcList, \ - TUint aLeft, TUint aRight); - TBool AddToDependency(TUint aOff); - TBool CreateDependency(); - OrdZeroRecord* FindDependency(char* aName, TUint aLen); - DllRec * SearchImports(char *aName); - TInt GetLookupTblSize(){ return iSymInfoHdr.iSize;} - void SetLookupTblBase(TInt); - void GetExportSymInfoHeader(E32EpocExpSymInfoHdr& aSymInfoHdr); - void SetExportSymInfo(); - TUint GetSymLookupSection(char* aBuff); - }; - -// This class is used to create symbols to support named lookups. -// - class NamedExportSymbol - { - public: - NamedExportSymbol(char* aName, Elf32_Addr aValue); - ~NamedExportSymbol() - { - delete iNext; - } - - char* Name() { return iSymbolName;} - void Name(char* aName) {iSymbolName = aName;} - - TUint NameOffset() {return iSymbolNameOffset;} - void NameOffset(TUint aOffset) {iSymbolNameOffset = aOffset;} - - Elf32_Addr Value() { return iValue;} - void Value(Elf32_Addr aValue) { iValue = aValue;} - - NamedExportSymbol* Next() { return iNext;} - void Next(NamedExportSymbol* aNext) { iNext = aNext;} - - Elf32_Rel iReloc; // relocation entry for the symbol address - TUint iSymRelocType; // Whether it is a code or data relocation for this symbol - private: - char* iSymbolName; // Symbol name - TInt iSymIdx; - TUint iSymbolNameOffset;// offset of name in string table. - Elf32_Addr iValue; // symbol value - this is the address of the symbol - NamedExportSymbol *iNext; // next symbol - }; - -// This class is used to support symbol lookup of the static dependencies by linking in their -// 0th ordinal. - class OrdZeroRecord - { - public: - OrdZeroRecord(char* aName): - iName(aName), iNext(0){} - ~OrdZeroRecord() - { - delete iNext; - } - char *iName; // (linkas) name of the dependency - Elf32_Rel iReloc; // a relocation entry for the 0th ordinal of each dependency - OrdZeroRecord *iNext; // next dependency - TUint iOffset; - }; - struct NeededDLLsList - { - NeededDLLsList(TUint aOff) : iOffset(aOff), iNext(0) - {} - ~NeededDLLsList() - { - delete iNext; - } - TUint iOffset; - NeededDLLsList *iNext; - }; - -#endif - +/* +* Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#if !defined(__ELFDLL_H__) +#define __ELFDLL_H__ +//#include +#include "e32ldfmt.h" +#include "elfdefs.h" +#include "elffile.h" + +#define DLLSYMPREFIX "#" +#define DLLSYMPREFIX0 "#" +#define DLLSYMSUFFIX "#<\\DLL>" +#define ORDBASE 16 +#define EXPORTTABLENAME "DLL##ExportTable" +#define EXPORTTABLESIZENAME "DLL##ExportTableSize" + +class NamedExportSymbol; +class OrdZeroRecord; +struct NeededDLLsList; + +const TUint KNameLookupOffsetFlag32 = 0x0001; + +class ELFFile::ELFDllData + { +public: + ELFFile * iElfFile; + + char * iDynStrTab; + // bytesize of the dynamic string table + TInt iDynStrTabSize; + Elf32_Sym * iDynSymTab; + // size of an entry in the dynamic symbol table + TInt iSymSize; + // the rela relocation table + Elf32_Rela * iRela; + // size of rela relocation table in bytes + TInt iRelaSz; + // size of a rela entry in bytes + TInt iRelaEnt; + // the rel relocation table + Elf32_Rel * iRel; + // size of rel relocation table in bytes + TInt iRelSz; + // size of a rel entry in bytes + TInt iRelEnt; + + Elf32_HashTable * iHashTable; + + // Exported symbols required for lookup via names. + NamedExportSymbol *iNamedExportSymbolHead; + // Number of exported symbols - this doesn't nclude the absent symbols. + TInt iNamedExportCount; + // header of the export symbol info table + E32EpocExpSymInfoHdr iSymInfoHdr; + // String table size for the symbol names. + TUint iSymStringTableSize; + TUint iStringNameOffset; + + // Dependency list + // Static Dependencies - An 'import relocation' entry is required to be created + // for each such record. + OrdZeroRecord *iDepRecords; + OrdZeroRecord *iDepRecordsTail; + + // List of names obtained from DT_NEEDED entries in ELF. + // The order in which they appear is the order in which symbol + // lookup shall be followed. + NeededDLLsList *iNeededDllNames; + NeededDLLsList *iNeededDllNamesTail; + // Ordinal 0 of this binary. - A local relocation needs to be created for this + // record. + + OrdZeroRecord *iOrdZeroRec; + TInt iNamedLookupEnabled; + + ELFDllData(ELFFile * f); + ~ELFDllData(); + TBool Init(); + + TBool ParseDllSymbol(Elf32_Sym * s, char*& dll, TUint& len, TInt& ord); + class DllSymbol + { + public: + char * iDll; + TUint iLen; + TInt iOrd; + Elf32_Phdr * iSegment; + Elf32_Rel * iRel; + DllSymbol * iNext; + + DllSymbol(char * n, TUint l, TInt o) + : iDll(n), iLen(l), iOrd(o), iSegment(0),iRel(0),iNext(0) + {} + ~DllSymbol() + { + delete iNext; + } + }; + DllSymbol * DllSymbolP(Elf32_Sym * s); + TBool AddSymbol(DllSymbol * s); + + class DllRec + { + public: + char * iName; + TUint iLen; + TInt nImports; + DllSymbol * iHead; + DllSymbol * iTail; + DllRec * iNext; + + DllRec(char * n, TInt l, DllSymbol * s) : + iName(n), iLen(l), nImports(1), iHead(s), iTail(s), iNext(0) + {} + ~DllRec() + { + delete iHead; + delete iNext; + } + void AddSymbol(DllSymbol * s); + }; + + DllRec * iDllHead; + DllRec * iDllTail; + + Elf32_Word iExportTableSymIdx; + Elf32_Word iExportTableSizeSymIdx; + + TBool InitExportInfo(); + TBool iImageIsDll; + TBool ImageIsDll() { return iImageIsDll; } + + Elf32_Word FindSymbolIndex(const char* s); + + TInt iNumberOfImports; + TInt iNumberOfExports; + TInt iNumberOfImportDlls; + + TInt iStringTableSize; + + TInt iNumberOfRelocs; + TInt iNumberOfCodeRelocs; + TInt iNumberOfDataRelocs; + + TInt NumberOfImports(void); + TInt NumberOfExports(void); + TInt NumberOfImportDlls(void); + + TInt NumberOfRelocs(void); + + TInt NumberOfCodeRelocs() { return iNumberOfCodeRelocs; } + TInt NumberOfDataRelocs() { return iNumberOfDataRelocs; } + + TBool GetRelocs(Elf32_Rel **aCodeRelocs, Elf32_Rel **aDataRelocs); + + TUint GetExportTableOffset(void); + char * CreateImportSection(TInt &aSize); + TBool CreateSymLookupTable(); + TBool SetupSymbolValues(); + TBool SetupSymbolNames(); + void Sort(NamedExportSymbol** aDstList, NamedExportSymbol* aSrcList); + void MergeSort(NamedExportSymbol** aDstList, NamedExportSymbol** aSrcList); + void MergeSort(NamedExportSymbol** aDstList, NamedExportSymbol** aSrcList, \ + TUint aLeft, TUint aRight); + TBool AddToDependency(TUint aOff); + TBool CreateDependency(); + OrdZeroRecord* FindDependency(char* aName, TUint aLen); + DllRec * SearchImports(char *aName); + TInt GetLookupTblSize(){ return iSymInfoHdr.iSize;} + void SetLookupTblBase(TInt); + void GetExportSymInfoHeader(E32EpocExpSymInfoHdr& aSymInfoHdr); + void SetExportSymInfo(); + TUint GetSymLookupSection(char* aBuff); + }; + +// This class is used to create symbols to support named lookups. +// + class NamedExportSymbol + { + public: + NamedExportSymbol(char* aName, Elf32_Addr aValue); + ~NamedExportSymbol() + { + delete iNext; + } + + char* Name() { return iSymbolName;} + void Name(char* aName) {iSymbolName = aName;} + + TUint NameOffset() {return iSymbolNameOffset;} + void NameOffset(TUint aOffset) {iSymbolNameOffset = aOffset;} + + Elf32_Addr Value() { return iValue;} + void Value(Elf32_Addr aValue) { iValue = aValue;} + + NamedExportSymbol* Next() { return iNext;} + void Next(NamedExportSymbol* aNext) { iNext = aNext;} + + Elf32_Rel iReloc; // relocation entry for the symbol address + TUint iSymRelocType; // Whether it is a code or data relocation for this symbol + private: + char* iSymbolName; // Symbol name + TInt iSymIdx; + TUint iSymbolNameOffset;// offset of name in string table. + Elf32_Addr iValue; // symbol value - this is the address of the symbol + NamedExportSymbol *iNext; // next symbol + }; + +// This class is used to support symbol lookup of the static dependencies by linking in their +// 0th ordinal. + class OrdZeroRecord + { + public: + OrdZeroRecord(char* aName): + iName(aName), iNext(0){} + ~OrdZeroRecord() + { + delete iNext; + } + char *iName; // (linkas) name of the dependency + Elf32_Rel iReloc; // a relocation entry for the 0th ordinal of each dependency + OrdZeroRecord *iNext; // next dependency + TUint iOffset; + }; + struct NeededDLLsList + { + NeededDLLsList(TUint aOff) : iOffset(aOff), iNext(0) + {} + ~NeededDLLsList() + { + delete iNext; + } + TUint iOffset; + NeededDLLsList *iNext; + }; + +#endif +