diff -r 000000000000 -r 83f4b4db085c toolsandutils/e32tools/elf2e32/source/pl_elfrelocations.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolsandutils/e32tools/elf2e32/source/pl_elfrelocations.cpp Tue Feb 02 01:39:43 2010 +0200 @@ -0,0 +1,142 @@ +// 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 ElfRelocations for the elf2e32 tool +// @internalComponent +// @released +// +// + +#include "pl_elfrelocations.h" +#include "pl_elflocalrelocation.h" + +/** +Constructor for class ElfRelocations +@internalComponent +@released +*/ +ElfRelocations::ElfRelocations() : \ + iCodeSortedP(false), iDataSortedP(false) +{ +} + +/** +Destructor for class ElfRelocations to release allocated memory +@internalComponent +@released +*/ +ElfRelocations::~ElfRelocations() +{ + if(iCodeRelocations.size()) + { + RelocationList::iterator aItr = iCodeRelocations.begin(); + RelocationList::iterator last = iCodeRelocations.end(); + ElfLocalRelocation *temp; + + while( aItr != last) + { + temp = *aItr; + aItr++; + delete temp; + } + iCodeRelocations.clear(); + } + if(iDataRelocations.size()) + { + RelocationList::iterator aItr = iDataRelocations.begin(); + RelocationList::iterator last = iDataRelocations.end(); + ElfLocalRelocation *temp; + + while( aItr != last) + { + temp = *aItr; + aItr++; + delete temp; + } + iDataRelocations.clear(); + } +} + + +/** +Function for adding Elf local Relocations. +@internalComponent +@released +@return 0 if therelocation is valid. +*/ +PLUINT32 ElfRelocations::Add(ElfLocalRelocation* aReloc){ + if(!aReloc) return 1; + + switch (aReloc->iSegmentType) + { + case ESegmentRO: + iCodeSortedP = false; + iCodeRelocations.push_back(aReloc); + break; + case ESegmentRW: + iDataSortedP = false; + iDataRelocations.push_back(aReloc); + break; + default: + ; + } + + return 0; +} + +/** +Function for getting code relocations. The reloc entries are +sorted on the address they refer to. +@internalComponent +@released +@return list of code relocation +*/ +ElfRelocations::RelocationList & ElfRelocations::GetCodeRelocations() +{ + if (!iCodeSortedP) + { + iCodeRelocations.sort(Cmp()); + iCodeSortedP = true; + } + return iCodeRelocations; +} + +/** +Function for getting data relocations. The reloc entries are +sorted on the address they refer to. +@internalComponent +@released +@return list of code relocation +*/ +ElfRelocations::RelocationList & ElfRelocations::GetDataRelocations() +{ + if (!iDataSortedP) + { + iDataRelocations.sort(Cmp()); + iDataSortedP = true; + } + return iDataRelocations; +} + +/** +Overloaded operator for comparing location the relocations refer to. +@internalComponent +@released +@return comparison of both relocation +*/ +bool ElfRelocations::Cmp::operator()(ElfRelocation * x, ElfRelocation * y) +{ + return x->iAddr < y->iAddr; +} + +