e32tools/elf2e32/source/pl_elfexecutable.h
changeset 0 044383f39525
--- /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_)