diff options
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/process.cc | 11 | ||||
-rw-r--r-- | src/sim/process.hh | 2 | ||||
-rw-r--r-- | src/sim/syscall_emul.hh | 29 |
3 files changed, 39 insertions, 3 deletions
diff --git a/src/sim/process.cc b/src/sim/process.cc index 7fa160995..d0dd3d92b 100644 --- a/src/sim/process.cc +++ b/src/sim/process.cc @@ -543,10 +543,17 @@ LiveProcess::updateBias() } +ObjectFile * +LiveProcess::getInterpreter() +{ + return objFile->getInterpreter(); +} + + Addr LiveProcess::getBias() { - ObjectFile *interp = objFile->getInterpreter(); + ObjectFile *interp = getInterpreter(); return interp ? interp->bias() : objFile->bias(); } @@ -555,7 +562,7 @@ LiveProcess::getBias() Addr LiveProcess::getStartPC() { - ObjectFile *interp = objFile->getInterpreter(); + ObjectFile *interp = getInterpreter(); return interp ? interp->entryPoint() : objFile->entryPoint(); } diff --git a/src/sim/process.hh b/src/sim/process.hh index aa4c7a008..54e6b2df2 100644 --- a/src/sim/process.hh +++ b/src/sim/process.hh @@ -341,6 +341,8 @@ class LiveProcess : public Process // bias are not available when the object file is created. void updateBias(); + ObjectFile *getInterpreter(); + Addr getBias(); Addr getStartPC(); diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index 71c0dd090..e9ed130f0 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -57,18 +57,20 @@ #ifdef __CYGWIN32__ #include <sys/fcntl.h> // for O_BINARY + #endif +#include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/uio.h> -#include <fcntl.h> #include <cerrno> #include <string> #include "base/chunk_generator.hh" #include "base/intmath.hh" // for RoundUp +#include "base/loader/object_file.hh" #include "base/misc.hh" #include "base/trace.hh" #include "base/types.hh" @@ -1354,6 +1356,31 @@ mmapImpl(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc, // Cleanup the mmap region before exiting this function. munmap(pmap, length); + // Maintain the symbol table for dynamic executables. + // The loader will call mmap to map the images into its address + // space and we intercept that here. We can verify that we are + // executing inside the loader by checking the program counter value. + // XXX: with multiprogrammed workloads or multi-node configurations, + // this will not work since there is a single global symbol table. + ObjectFile *interpreter = p->getInterpreter(); + if (interpreter) { + Addr text_start = interpreter->textBase(); + Addr text_end = text_start + interpreter->textSize(); + + Addr pc = tc->pcState().pc(); + + if (pc >= text_start && pc < text_end) { + FDEntry *fde = p->getFDEntry(tgt_fd); + + ObjectFile *lib = createObjectFile(fde->filename); + + if (lib) { + lib->loadAllSymbols(debugSymbolTable, + lib->textBase(), start); + } + } + } + // Note that we do not zero out the remainder of the mapping. This // is done by a real system, but it probably will not affect // execution (hopefully). |