arch,base: Stop loading the interpreter in ElfObject.
The interpreter is a separate object file, and while it's convenient to hide loading it in the code which loads the main object file, it breaks the conceptual abstraction since you only asked it to load the main object file. Also, this makes every object file format reimplement the idea of loading the interpreter. Admittedly only ELF recognizes and sets up an interpreter, but other formats conceptually could too. This does move that limitted hypothetical redundancy out of the object file formats and moves it into the process objects, but I think conceptually that's where it belongs. It would also probably be pretty easy to add a method to the base Process class that would handle loading an image and also the interpreter image. This change does not (yet) separate reading symbol tables. Change-Id: I4a165eac599a9bcd30371a162379e833c4cc89b4 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21465 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Brandon Potter <Brandon.Potter@amd.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -78,6 +78,8 @@ AlphaProcess::argsInit(int intSize, int pageSize)
|
||||
updateBias();
|
||||
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
|
||||
std::vector<AuxVector<uint64_t>> auxv;
|
||||
|
||||
|
||||
@@ -271,6 +271,8 @@ ArmProcess::argsInit(int pageSize, IntRegIndex spIndex)
|
||||
|
||||
// load object file into target memory
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
|
||||
//Setup the auxilliary vectors. These will already have endian conversion.
|
||||
//Auxilliary vectors are loaded only for elf formatted executables.
|
||||
|
||||
@@ -94,6 +94,8 @@ MipsProcess::argsInit(int pageSize)
|
||||
|
||||
// load object file into target memory
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
|
||||
std::vector<AuxVector<IntType>> auxv;
|
||||
|
||||
|
||||
@@ -100,6 +100,8 @@ PowerProcess::argsInit(int intSize, int pageSize)
|
||||
|
||||
// load object file into target memory
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
|
||||
//Setup the auxilliary vectors. These will already have endian conversion.
|
||||
//Auxilliary vectors are loaded only for elf formatted executables.
|
||||
|
||||
@@ -125,6 +125,8 @@ RiscvProcess::argsInit(int pageSize)
|
||||
|
||||
updateBias();
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
ElfObject* elfObject = dynamic_cast<ElfObject*>(objFile);
|
||||
memState->setStackMin(memState->getStackBase());
|
||||
|
||||
|
||||
@@ -209,6 +209,8 @@ SparcProcess::argsInit(int pageSize)
|
||||
|
||||
// load object file into target memory
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
|
||||
enum hardwareCaps
|
||||
{
|
||||
|
||||
@@ -775,6 +775,8 @@ X86Process::argsInit(int pageSize,
|
||||
|
||||
// load object file into target memory
|
||||
objFile->loadSegments(initVirtMem);
|
||||
if (objFile->getInterpreter())
|
||||
objFile->getInterpreter()->loadSegments(initVirtMem);
|
||||
|
||||
enum X86CpuFeature {
|
||||
X86_OnboardFPU = 1 << 0,
|
||||
|
||||
@@ -464,18 +464,6 @@ ElfObject::loadWeakSymbols(SymbolTable *symtab, Addr base, Addr offset,
|
||||
return loadSomeSymbols(symtab, STB_WEAK, addr_mask, base, offset);
|
||||
}
|
||||
|
||||
bool
|
||||
ElfObject::loadSegments(const PortProxy &mem_proxy)
|
||||
{
|
||||
if (!ObjectFile::loadSegments(mem_proxy))
|
||||
return false;
|
||||
|
||||
if (interpreter)
|
||||
interpreter->loadSegments(mem_proxy);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
ElfObject::getSections()
|
||||
{
|
||||
|
||||
@@ -89,8 +89,6 @@ class ElfObject : public ObjectFile
|
||||
public:
|
||||
virtual ~ElfObject() {}
|
||||
|
||||
bool loadSegments(const PortProxy &mem_proxy) override;
|
||||
|
||||
virtual bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
|
||||
Addr offset = 0, Addr addr_mask = maxAddr)
|
||||
override;
|
||||
|
||||
Reference in New Issue
Block a user