bintools/elftools/inc/elffile.h
changeset 0 044383f39525
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/elftools/inc/elffile.h	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 1995-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(__ELFFILE_H__)
+#define __ELFFILE_H__
+#include <e32rom.h>
+#include "e32ldfmt.h"
+#include <elfdefs.h>
+
+#define ELFADDR(rtype, p, o) (rtype *)(((char *)p) + o)
+
+//
+enum TImportStat {EImpError, EImpSuccess, EImpDone};
+//
+class ELFFile
+	{
+public:
+	ELFFile();
+	~ELFFile();
+	TBool Init(const TText * const aFileName);
+	void Close(void);
+
+	char *CreateImportSection(TInt &aSize);
+
+	TBool GetRelocs(Elf32_Rel **aCodeRelocs, Elf32_Rel **aDataRelocs);
+	TUint16 GetRelocType(Elf32_Rel* aReloc);
+
+	TInt NumberOfImports() const;
+	TInt NumberOfImportDlls() const;
+	TInt NumberOfExports() const;
+	TInt NumberOfRelocs();
+
+	
+
+	TInt NumberOfCodeRelocs();
+	TInt NumberOfDataRelocs();
+	
+public:
+	TUint iCodeSize;
+	TUint iDataSize;
+	TUint iBssSize;
+
+
+	TUint GetCodeSize();
+	TBool HasInitialisedData();
+	TUint GetDataSize();
+	TBool HasBssData();
+	TUint GetBssSize();
+	
+
+	Elf32_Phdr * GetSegment(TInt idx) {return &iPhdr[idx];}
+	Elf32_Phdr * GetSegmentFromAddr(Elf32_Addr addr);
+
+	char * GetCode() { return ELFADDR(char, iElfFile, iCodeSegmentHdr->p_offset); }
+	char * GetData() { return ELFADDR(char, iElfFile, iDataSegmentHdr->p_offset); }
+	TBool CodeSegmentP(Elf32_Phdr * s) { return (TBool)(s == iCodeSegmentHdr); }
+	TBool CodeSegmentP(TInt idx) { return (TBool)(idx == iCodeSegmentIdx); }
+	TInt CodeSegmentIndex() {return iCodeSegmentIdx;}
+	TBool DataSegmentP(Elf32_Phdr * s) { return (TBool)(s == iDataSegmentHdr); }
+	TBool DataSegmentP(TInt idx) { return (TBool)(idx == iDataSegmentIdx); }
+	TInt DataSegmentIndex() {return iDataSegmentIdx;}
+
+	TUint * CodePtrFromAddr(Elf32_Addr addr) { return PtrInSegment(iCodeSegmentHdr, addr); }
+	TUint * DataPtrFromAddr(Elf32_Addr addr) { return PtrInSegment(iDataSegmentHdr, addr); }
+
+
+	char * ELFFileBase() { return (char *) iElfFile; }
+
+	TUint GetExportTableOffset(void);
+	TUint GetEntryPointOffset(void) { return iElfFile->e_entry - iCodeSegmentHdr->p_vaddr; }
+
+	TBool SymbolPresent(TText *s);
+	Elf32_Sym * FindSymbol(const TText *);
+
+	TBool GetExceptionIndexInfo(TUint32 &aOffset);
+	TBool SetUpLookupTable();
+	void SetLookupTblBase(TInt);
+	TInt GetLookupTblSize();
+	void GetExportSymInfoHeader(E32EpocExpSymInfoHdr& aSymInfoHdr);
+	TUint GetSymLookupSection(char* aBuff);
+private:
+	TBool InitHeaders(void);
+	TBool InitDllData(void);
+
+	TUint * PtrInSegment(Elf32_Phdr * phdr, Elf32_Addr addr) 
+	        { 
+		return ELFADDR(TUint, ELFADDR(TUint, iElfFile, phdr->p_offset), (addr - phdr->p_vaddr));
+		}
+
+
+	TBool IsValidFileHeader(Elf32_Ehdr * aElfHdr);
+	void CopySectionData(TAny *source, TAny *dest, TUint32 fileLength, TUint32 memLength);
+	TBool ProcessRelocData(TAny *relocData,TInt dataSize);
+	ELFFile(const ELFFile&);
+	const ELFFile & operator = (const ELFFile&);
+public:
+	TBool	iImageIsDll;
+	TBool	ImageIsDll() { return iImageIsDll; }
+	Elf32_Addr iLinkedBase;
+
+	TUint iEntryPoint;
+	TUint iHeapCommittedSize;
+	TUint iHeapReservedSize;
+	TUint iStackCommittedSize;
+	TUint iStackReservedSize;
+private:
+	friend class E32ImageFile;
+	friend class E32ImageFile_ELF;
+
+	TText * iFileName;
+	TInt32 iFileHandle;
+	Elf32_Ehdr * iElfFile;
+	Elf32_Phdr * iPhdr;
+	Elf32_Phdr * iDynamicSegmentHdr;
+	TInt iDynamicSegmentIdx;
+	Elf32_Phdr * iCodeSegmentHdr;
+	TInt iCodeSegmentIdx;
+	Elf32_Phdr * iDataSegmentHdr;
+	TInt iDataSegmentIdx;
+
+	Elf32_Shdr * iSectionHeaderTable;
+	TInt iSymIdx;
+	Elf32_Sym * iSymTab;
+
+	class ELFDllData;
+	ELFDllData * iDllData;
+
+	TCpu iCpu;
+
+
+	};
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+