[GCCE] We need a way for the HAL config extension to parameterise the HAL config file (.hcf) that will be used, depending upon
the toolchain we are building with. E.g. if we are building BeagleBoard with RVCT we can configure hardware floating point
because we have ARM's vfp math libraries; if we are building it with GCC, we lack this library support.
// 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_)