--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/elf2e32/source/pl_elfexecutable.h Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,247 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// Implementation of the Class ElfExecutable for the elf2e32 tool
+// @internalComponent
+// @released
+//
+//
+
+#if !defined(_PL_ELFEXECUTABLE_H_)
+#define _PL_ELFEXECUTABLE_H_
+
+#include "pl_common.h"
+#include <list>
+#include <hash_map>
+#include "pl_elfimports.h"
+#include "pl_elfrelocations.h"
+#include "pl_elfexports.h"
+
+using std::list;
+using std::hash_map;
+
+class DllSymbol;
+class Symbol;
+class ElfRelocations;
+class ElfExports;
+class ParameterListInterface;
+class ElfLocalRelocation;
+/**
+This class is for ELF object carrying the elf header, sections, segments.
+@internalComponent
+@released
+*/
+class ElfExecutable
+{
+
+public:
+ ElfExecutable(ParameterListInterface *aParameterListInterface);
+ virtual ~ElfExecutable();
+
+ PLUINT32 ProcessElfFile(Elf32_Ehdr *aElfHdr);
+ void DumpElfFile(char* aFile);
+
+ PLUINT32 ProcessSymbols();
+ ElfImports::ImportMap GetImports();
+ ElfExports* GetExports();
+ DllSymbol* AddToExports(char* aDll, DllSymbol* aSymbol);
+ void AddToImports(ElfImportRelocation* aReloc);
+ PLUINT32 AddToRelocations(ElfRelocation* aReloc);
+ void AddToLocalRelocations(ElfRelocation* aReloc);
+ void ProcessVerInfo();
+
+ Elf32_Sym* FindSymbol(char* aSymName);
+
+ PLUINT32 GetSymbolOrdinal( char* aSymName);
+ PLUINT32 GetSymbolOrdinal( Elf32_Sym* );
+ char* GetSymbolName( PLUINT32 aSymIdx);
+ Elf32_Word GetRelocationOffset(ElfRelocation * aReloc);
+ Elf32_Word *GetRelocationPlace(ElfRelocation * aReloc);
+
+ Elf32_Word GetROBase();
+ Elf32_Word GetRWBase();
+ size_t GetROSize();
+ size_t GetRWSize();
+ size_t GetBssSize();
+ MemAddr GetRawROSegment();
+ MemAddr GetRawRWSegment();
+ Elf32_Word EntryPointOffset();
+ ESegmentType SegmentType(Elf32_Addr aAddr);
+ Elf32_Phdr* Segment(Elf32_Addr aAddr);
+ ElfRelocations::RelocationList & GetCodeRelocations();
+ ElfRelocations::RelocationList & GetDataRelocations();
+ ElfRelocations& GetLocalRelocations();
+ bool ExeceptionsPresentP();
+ ElfExports::ExportList& GetExportsInOrdinalOrder();
+ Elf32_Sym* LookupStaticSymbol(char * aName);
+public:
+ /**
+ * The elf header pointer which points to the base of the file records
+ */
+ Elf32_Ehdr *iElfHeader;
+ Elf32_Addr iEntryPoint;
+ /**
+ * The dynamic program header of the elf file
+ */
+ Elf32_Phdr *iProgHeader;
+
+ PLUINT32 iSONameOffset;
+ char *iSOName;
+ /**
+ * This member points to the base of the section header table.
+ */
+ Elf32_Shdr *iSections;
+ Elf32_Verdef *iVersionDef;
+ PLUINT32 iVerDefCount;
+ Elf32_Verneed *iVersionNeed;
+ PLUINT32 iVerNeedCount;
+ Elf32_Half *iVersionTbl;
+ PLUINT32 iRelSize;
+ PLUINT32 iRelEntSize;
+ PLUINT32 iNRelocs;
+ Elf32_Rel *iRel;
+ PLUINT32 iRelaSize;
+ PLUINT32 iRelaEntSize;
+ Elf32_Rela *iRela;
+ char *iStringTable;
+ char *iSectionHdrStrTbl;
+
+ list<char*> iNeeded;
+ VersionInfo *iVerInfo;
+ /**
+ * The dynamic symbol array.
+ */
+ Elf32_Sym *iElfDynSym;//The ELF symbol
+ hash_map<PLUINT32, DllSymbol*> iSymbolTable; //The representation
+
+ /**
+ * The static symbol table.
+ */
+ Elf32_Sym *iSymTab;
+ char *iStrTab;
+ Elf32_Sym *iLim;
+
+ PLUINT32 iNSymbols;
+ Elf32_HashTable *iHashTbl;
+ Elf32_Phdr *iDynSegmentHdr;
+ Elf32_Phdr *iDataSegmentHdr;
+ MemAddr iDataSegment;
+ size_t iDataSegmentSize;
+ PLUINT32 iDataSegmentIdx;
+ Elf32_Phdr *iCodeSegmentHdr;
+ MemAddr iCodeSegment;
+ size_t iCodeSegmentSize;
+ PLUINT32 iCodeSegmentIdx;
+ ElfImports iImports;
+ ElfExports *iExports;
+ ElfRelocations iLocalRelocations;
+ ParameterListInterface *iParameterListInterface;
+ PLUINT32 iPltGotBase;
+ PLUINT32 iPltGotLimit;
+ PLUINT32 iStrTabSz;
+ PLUINT32 iSymEntSz;
+ Elf32_Word *iPltGot;
+ PLUINT32 iPltRelType;
+ Elf32_Rel *iPltRel;
+ PLUINT32 iPltRelaSz;
+ Elf32_Rela *iPltRela;
+ PLUINT32 iPltRelSz;
+ PLUINT32 iJmpRelOffset;
+
+ PLUINT32 ValidateElfFile();
+ PLUINT32 ProcessDynamicEntries();
+ void ProcessRelocations();
+ template <class T> void ProcessRelocations(T *aElfRel, size_t aSize);
+
+ VersionInfo* GetVersionInfo(PLUINT32 aIndex);
+ char* SymbolDefinedInDll(PLUINT32 aSymbolIndex);
+ void SetVersionRecord( ElfRelocation* aReloc );
+
+/** This function says if the Symbol is a global symbol
+@return It returns true if the Symbol is a global one.
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool GlobalSymbol(Elf32_Sym* aSym);
+
+/** This function says if the Symbol is Exported
+@return It returns true if the Symbol is an exported one.
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool ExportedSymbol(Elf32_Sym* aSym);
+
+/** This function says if the Symbol is Imported
+@return It returns true if the Symbol is an imported one.
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool ImportedSymbol(Elf32_Sym* aSym);
+
+/** This function says if the Symbol is a Code Symbol
+@return It returns true if the Symbol is of Code type.
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool FunctionSymbol(Elf32_Sym* aSym);
+
+/** This function says if the Symbol is a Data Symbol
+@return It returns true if the Symbol is of Data type.
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool DataSymbol(Elf32_Sym* aSym);
+
+/** This function says if the Symbol is Defined
+@return It returns true if the Symbol is defined.
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool DefinedSymbol(Elf32_Sym* aSym);
+
+/** This function says if the Symbol has a default Visibility
+@return It returns true if the Symbol has a default Visibility
+@param aSym The reference to the Symbol whose attribute is being checked
+*/
+bool VisibleSymbol(Elf32_Sym* aSym);
+
+/** This function finds the segment in which this address belongs
+@return the segment type
+@param aAddr The address within the executable
+*/
+
+Elf32_Word Addend(Elf32_Rel* aRel);
+Elf32_Word Addend(Elf32_Rela* aRel);
+
+char* SymbolFromDSO(PLUINT32 aSymbolIndex);
+Elf32_Word* GetFixupLocation(ElfLocalRelocation* aReloc, Elf32_Addr aPlace);
+ESegmentType Segment(Elf32_Sym *aSym);
+Elf32_Phdr* SegmentFromAbs(Elf32_Addr aAddr);
+Elf32_Phdr* Segment(ESegmentType aType);
+
+/** This function processes the linker generated Veneer symbols and
+ * creates a relocation entry.
+ */
+void ProcessVeneers();
+/** This function processes the ELF file to find the static symbol table.
+*/
+void FindStaticSymbolTable();
+/** This function finds the .comment section
+@return the pointer to the comment section
+*/
+char* FindCommentSection();
+/** This function finds the value at the address passed in
+@return the value at the address passed in
+@param aAddr The address within the executable
+*/
+Elf32_Word FindValueAtLoc(Elf32_Addr aOffset);
+};
+
+
+
+
+#endif // !defined(_PL_ELFEXECUTABLE_H_)