e32tools/elf2e32/source/pl_elfproducer.h
author timothy.murphy@nokia.com
Sun, 28 Feb 2010 21:18:07 +0200
branchfix
changeset 279 733464eaac50
parent 0 044383f39525
permissions -rw-r--r--
fix: make sure host attribute is set rather than blank in logs on windows by using the env var 'COMPUTERNAME' instead of 'HOSTNAME'. Thus make it less difficult to order recipes in the log by time.

// 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 ElfProducer for the elf2e32 tool
// @internalComponent
// @released
// 
//

#if !defined(_PL_ELFPRODUCER_H_)
#define _PL_ELFPRODUCER_H_

#include "pl_elfexecutable.h"
#include <string>

//enum for section index
typedef enum _SECTION_INDEX_ {
	DUMMY_SECTION=0,
	CODE_SECTION,
	DYNAMIC_SECTION,
	HASH_TBL_SECTION,
	VER_DEF_SECTION,
	VERSION_SECTION,
	STRING_SECTION,
	SYMBOL_SECTION,
	SH_STR_SECTION,
	MAX_SECTIONS=SH_STR_SECTION
}SECTION_INDEX;

//enum for DYN entries
typedef enum _DYN_ENTRIES_ {
	DSO_DT_DSONAME=0,
	DSO_DT_SYMTAB,
	DSO_DT_SYMENT,
	DSO_DT_STRTAB,
	DSO_DT_STRSZ,
	DSO_DT_VERSYM,
	DSO_DT_VERDEF,
	DSO_DT_VERDEFNUM,
	DSO_DT_HASH,
	DSO_DT_NULL,
	MAX_DYN_ENTS=DSO_DT_NULL,
}DYN_ENTRIES;

#define DEFAULT_VERSION	2
/**
This class provides elf contents for the dso file creation. It generates the
elf header, sections, dynamic array and the relocatrion entries.
@internalComponent
@released
*/
class ElfProducer : public ElfExecutable
{

	typedef std::list<Symbol*> SymbolList;
public:
	ElfProducer(ParameterListInterface *aParameterListInterface);
	~ElfProducer();
	
	void SetSymbolList(SymbolList& aSymbolList);
	void WriteElfFile(char* aDsoFullName,char* aDsoFileName, char* aLinkAs);

private:
	/**
	 * This list is passed from the UseCaseHandler via the DSOHandler to this class.
	 * This is used to create the export info when only a def file is available and
	 * the DSO needs to be generated for that.
	 */
	typedef std::string	String;
	/** The proxy DSO file name*/
	String			iDSOName;

	/** The offset of the file name within the string table of the ELF file*/
	PLUINT32		iDSONameOffset;

	/** The DLL name that defines the export Symbols*/
	String			iLinkAs;

	/** The offset of the DLL name within the string table within the ELF file*/
	PLUINT32		iLinkAsOffset;

	/** The export Symbol list*/
	SymbolList		*iSymbolsList;

	/** The number of export Symbols*/
	PLUINT32		iNSymbols;

	/** The proxy DSO full file name*/
	String			iDsoFullName;

	/*DSO content Fields*/

	/** The Elf version definition auxiliary section*/
	Elf32_Verdaux	*iDSODaux;

	/** The Buckets for the hash table*/
	Elf32_Sword		*iDSOBuckets;

	/** The chains pointed to by the buckets belonging to the hash table*/
	Elf32_Sword		*iDSOChains;

	/** The Elf Dynamic section table*/
	Elf32_Dyn		iDSODynTbl[MAX_DYN_ENTS+1];

	/** The code section*/
	PLUINT32		*iCodeSectionData;

	/** The Elf file offset maintained for writing the different sections of the Elf file*/
	PLUINT32		iElfFileOffset;

	/** The Elf String table*/
	String			iDSOSymNameStrTbl;

	/** The Elf Section-header String table*/
	String			iDSOSectionNames;


	void InitElfContents();
	void Cleanup();
	void SetSymolFields(Symbol *aSym, Elf32_Sym* aElfSym, PLUINT32 aIndex);
	void AddToHashTable(const char* aSymName, PLUINT32 aIndex);
	void CreateVersionTable();
	void CreateElfHeader();
	void CreateSections();
	void SetSectionFields(PLUINT32 aSectionIndex, char* aSectionName, PLUINT32 aType, \
								   PLUINT32 aEntSz, PLUINT32 aSectionSize, PLUINT32 aLink, \
								   PLUINT32 aInfo, PLUINT32 aAddrAlign, PLUINT32 aFlags, \
								   PLUINT32 aAddr);
	void CreateDynamicEntries();
	void CreateProgHeader();

	void WriteElfContents();
	void AlignString(String& aStr);

};




#endif // !defined(_PL_ELFPRODUCER_H_)