--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/elftools/inc/elfdll.h Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +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 <e32rom.h>
+#include "e32ldfmt.h"
+#include <elfdefs.h>
+#include "elffile.h"
+
+#define DLLSYMPREFIX "#<DLL>"
+#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
+