fix: stop using "magic" numbers in string operations for the copyannofile2log feature
fix: When using the copylogfromannofile workaround, extract the build ID and build duration and add to the log as these are useful for analysis. The log should now be identical to the stdout file.
fix: Remove extra blank lines from output in copylogfromannofile mode.
/*
* 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