diff -r 1af5c1be89f8 -r 92d87f2e53c2 tools/elf4rom/src/elfsymboltablemanager.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/elf4rom/src/elfsymboltablemanager.h Fri Jan 15 09:07:44 2010 +0000
@@ -0,0 +1,233 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see .
+*/
+
+#ifndef ELFSYMBOLTABLEMANAGER_H_
+#define ELFSYMBOLTABLEMANAGER_H_
+
+#include
+#include
+
+#include "filefragment.h"
+#include "elfstringtable.h"
+#include "outputfile.h"
+#include "elfheader.h"
+#include "e32romimage.h"
+#include "elfsection.h"
+#include "elfsectionmanager.h"
+#include "defs.h" // String
+
+class ElfSymbolTableManager;
+
+class SectionNumberMapping {
+public:
+ SectionNumberMapping(size_t aOld, size_t aNew):
+ iOld(aOld), iNew(aNew)
+ {}
+
+ SectionNumberMapping & operator=(const SectionNumberMapping & aSectionNumberMapping){
+ iOld = aSectionNumberMapping.iOld;
+ iNew = aSectionNumberMapping.iNew;
+ return *this;
+ }
+
+ SectionNumberMapping(const SectionNumberMapping & aSectionNumberMapping){
+ *this = aSectionNumberMapping;
+ }
+
+ size_t iOld;
+ size_t iNew;
+};
+
+typedef std::vector< SectionNumberMapping > SectionNumberMap;
+
+class SectionVaddrAddendMapping {
+public:
+ SectionVaddrAddendMapping(size_t aSectionNumber, signed int aAddend):
+ iSectionNumber(aSectionNumber), iAddend(aAddend)
+ {}
+
+ SectionVaddrAddendMapping & operator=(const SectionVaddrAddendMapping & aSectionVaddrAddendMapping){
+ iSectionNumber = aSectionVaddrAddendMapping.iSectionNumber;
+ iAddend = aSectionVaddrAddendMapping.iAddend;
+ return *this;
+ }
+
+ SectionVaddrAddendMapping(const SectionVaddrAddendMapping & SectionVaddrAddendMapping){
+ *this = SectionVaddrAddendMapping;
+ }
+
+ size_t iSectionNumber;
+ signed int iAddend;
+};
+
+typedef std::vector< SectionVaddrAddendMapping > SectionVaddrAddendMap;
+
+class ElfFileSymbolFragments {
+public:
+ ElfFileSymbolFragments(ElfSymbolTableManager * aElfSymbolTableManager):
+ iPath(""),
+ iSymbolTableOffset(0), iSymbolTableSize(0),
+ iFirstGlobal(0),
+ iStringTableOffset(0), iStringTableSize(0),
+ iElfSymbolTableManager(aElfSymbolTableManager)
+ {
+ iSectionNumberMap.clear();
+ iSectionVaddrAddendMap.clear();
+ }
+
+ ElfFileSymbolFragments & operator=(const ElfFileSymbolFragments & aElfFileSymbolFragments){
+ iPath = aElfFileSymbolFragments.iPath;
+ iSymbolTableOffset = aElfFileSymbolFragments.iSymbolTableOffset;
+ iSymbolTableSize = aElfFileSymbolFragments.iSymbolTableSize;
+ iFirstGlobal = aElfFileSymbolFragments.iFirstGlobal;
+ iStringTableOffset = aElfFileSymbolFragments.iStringTableOffset;
+ iStringTableSize = aElfFileSymbolFragments.iStringTableSize;
+ iSectionNumberMap = aElfFileSymbolFragments.iSectionNumberMap;
+ iSectionVaddrAddendMap = aElfFileSymbolFragments.iSectionVaddrAddendMap;
+ iElfSymbolTableManager = aElfFileSymbolFragments.iElfSymbolTableManager;
+ return *this;
+ }
+
+ ElfFileSymbolFragments(const ElfFileSymbolFragments & aElfFileSymbolFragments){
+ *this = aElfFileSymbolFragments;
+ }
+
+
+
+ void AddSymbolTable(String & aPath, size_t aOffset, size_t aSize, size_t aFirstGlobal);
+
+ void AddStringTable(String & aPath, size_t aOffset, size_t aSize);
+ String & GetPath() { return iPath; }
+ size_t GetSymbolTableOffset() { return iSymbolTableOffset; }
+ size_t GetSymbolTableSize() { return iSymbolTableSize; }
+ size_t GetFirstGlobal() { return iFirstGlobal; }
+ size_t GetStringTableOffset() { return iStringTableOffset; }
+ size_t GetStringTableSize() { return iStringTableSize; }
+
+ void SetSectionNumberMap(SectionNumberMap & aSectionNumberMap){
+ iSectionNumberMap = aSectionNumberMap;
+ }
+
+ size_t LookupSection(size_t ndx);
+
+ void SetSectionVaddrAddendMap(SectionVaddrAddendMap & aSectionVaddrAddendMap){
+ iSectionVaddrAddendMap = aSectionVaddrAddendMap;
+ }
+
+ int LookupVaddrAddend(size_t ndx);
+
+ void Validate() {
+ assert(iPath.size() != 0);
+ assert(iSymbolTableOffset != 0);
+ assert(iSymbolTableSize != 0);
+ assert(iStringTableOffset != 0);
+ assert(iStringTableSize != 0);
+ assert(!iSectionNumberMap.empty());
+ assert(!iSectionVaddrAddendMap.empty());
+ }
+
+ void Reset(){
+ new (this) ElfFileSymbolFragments(iElfSymbolTableManager);
+ }
+
+private:
+ String iPath;
+ size_t iSymbolTableOffset;
+ size_t iSymbolTableSize;
+ size_t iFirstGlobal;
+ size_t iStringTableOffset;
+ size_t iStringTableSize;
+ SectionNumberMap iSectionNumberMap;
+ SectionVaddrAddendMap iSectionVaddrAddendMap;
+ ElfSymbolTableManager * iElfSymbolTableManager;
+
+};
+
+class ElfSymTabStringTable : public ElfStringTable {
+public:
+ ElfSymTabStringTable(ElfSymbolTableManager & aElfSymbolTableManager):
+ iElfSymbolTableManager(aElfSymbolTableManager)
+ {}
+
+ virtual size_t Size();
+
+private:
+ ElfSymbolTableManager & iElfSymbolTableManager;
+};
+
+class ElfSymbolTableManager : public FileFragmentOwner {
+public:
+ ElfSymbolTableManager(Elf32Header & aElf32Header, E32RomImage & aRomImage,
+ OutputFile & aOutputFile, ElfSectionManager & aElfSectionManager) :
+ iElf32Header(aElf32Header), iRomImage(aRomImage),
+ iOutputFile(aOutputFile), iElfSectionManager(aElfSectionManager),
+ iData(NULL),
+ iSymbolStringTableSizeValid(false),
+ iSymbolStringTableSize(0),
+ iCurrentFragment(this),
+ iStringTable(*this)
+ {}
+
+ // The FileFragmentOwner protocol
+ virtual void GetFileFragmentData(FileFragmentData & aFileFragmentData );
+ virtual size_t Size();
+ virtual void DeleteFileFragmentData();
+ virtual void AddData(OutputFile & aOutputFile);
+
+ void AddSymbolTable(String & aPath, size_t aOffset, size_t aSize, size_t aFirstGlobal){
+ iCurrentFragment.AddSymbolTable(aPath, aOffset, aSize, aFirstGlobal);
+ }
+ void AddStringTable(String & aPath, size_t aOffset, size_t aSize){
+ iCurrentFragment.AddStringTable(aPath, aOffset, aSize);
+
+ }
+ virtual void AddSymbolFragment(){
+ iSymbolFragments.push_back(iCurrentFragment);
+ }
+ virtual void AddSymbolTable();
+
+ size_t GetSymTabStringsSectionSize();
+
+ virtual void Finalize(SectionNumberMap & aSectionNumberMap, SectionVaddrAddendMap & aSectionVaddrAddendMap);
+
+private:
+ // Don't want one of these to be copied
+ ElfSymbolTableManager(const ElfSymbolTableManager & aElfSymbolTableManager);
+
+ ElfSymbolTableManager & operator=(const ElfSymbolTableManager & aElfSymbolTableManager);
+
+ size_t GetSymTabSectionSize();
+ size_t GetFirstNonLocalIndex();
+
+private:
+ typedef std::vector SymbolFragmentList;
+private:
+ Elf32Header & iElf32Header;
+ E32RomImage & iRomImage;
+ OutputFile & iOutputFile;
+ ElfSectionManager & iElfSectionManager;
+
+ char * iData;
+ bool iSymbolStringTableSizeValid;
+ size_t iSymbolStringTableSize;
+ ElfFileSymbolFragments iCurrentFragment;
+ SymbolFragmentList iSymbolFragments;
+ ElfSymTabStringTable iStringTable;
+};
+
+#endif /*ELFSYMBOLTABLEMANAGER_H_*/