changeset 5967db4cff04 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=5967db4cff04
description:
base: add symbol support for dynamic libraries
Libraries are loaded into the process address space using the
mmap system call. Conveniently, this happens to be a good
time to update the process symbol table with the library's
incoming symbols so we handle the table update from within the
system call.
This works just like an application's normal symbols. The only
difference between a dynamic library and a main executable is
when the symbol table update occurs. The symbol table update for
an executable happens at program load time and is finished before
the process ever begins executing. Since dynamic linking happens
at runtime, the symbol loading happens after the library is
first loaded into the process address space. The library binary
is examined at this time for a symbol section and that section
is parsed for symbol types with specific bindings (global,
local, weak). Subsequently, these symbols are added to the table
and are available for use by gem5 for things like trace
generation.
Checkpointing should work just as it did previously. The address
space (and therefore the library) will be recorded and the symbol
table will be entirely recorded. (It's not possible to do anything
clever like checkpoint a program and then load the program back
with different libraries with LD_LIBRARY_PATH, because the
library becomes part of the address space after being loaded.)
diffstat:
src/arch/arm/freebsd/system.cc | 4 +-
src/arch/arm/linux/system.cc | 4 +-
src/arch/sparc/system.cc | 2 +-
src/base/loader/aout_object.cc | 13 +++++++++-
src/base/loader/aout_object.hh | 11 +++++---
src/base/loader/dtb_object.cc | 12 ++++++++-
src/base/loader/dtb_object.hh | 10 +++++---
src/base/loader/ecoff_object.cc | 14 ++++++++++-
src/base/loader/ecoff_object.hh | 10 +++++---
src/base/loader/elf_object.cc | 49 ++++++++++++++++++++++++++++++----------
src/base/loader/elf_object.hh | 31 +++++++++++++++++--------
src/base/loader/object_file.hh | 24 +++++++++++--------
src/base/loader/raw_object.cc | 17 ++++++++++---
src/base/loader/raw_object.hh | 11 +++++---
src/sim/process.cc | 11 +++++++-
src/sim/process.hh | 2 +
src/sim/syscall_emul.hh | 29 +++++++++++++++++++++++-
17 files changed, 188 insertions(+), 66 deletions(-)
diffs (truncated from 523 to 300 lines):
diff -r 484c04261226 -r 5967db4cff04 src/arch/arm/freebsd/system.cc
--- a/src/arch/arm/freebsd/system.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/arch/arm/freebsd/system.cc Thu Mar 17 10:34:27 2016 -0700
@@ -86,8 +86,8 @@
// to do this permanently, for but early bootup work
// it is helpful.
if (params()->early_kernel_symbols) {
- kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask);
- kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask);
+ kernel->loadGlobalSymbols(kernelSymtab, 0, 0, loadAddrMask);
+ kernel->loadGlobalSymbols(debugSymbolTable, 0, 0, loadAddrMask);
}
// Setup boot data structure
diff -r 484c04261226 -r 5967db4cff04 src/arch/arm/linux/system.cc
--- a/src/arch/arm/linux/system.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/arch/arm/linux/system.cc Thu Mar 17 10:34:27 2016 -0700
@@ -110,8 +110,8 @@
// to do this permanently, for but early bootup work
// it is helpful.
if (params()->early_kernel_symbols) {
- kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask);
- kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask);
+ kernel->loadGlobalSymbols(kernelSymtab, 0, 0, loadAddrMask);
+ kernel->loadGlobalSymbols(debugSymbolTable, 0, 0, loadAddrMask);
}
// Setup boot data structure
diff -r 484c04261226 -r 5967db4cff04 src/arch/sparc/system.cc
--- a/src/arch/sparc/system.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/arch/sparc/system.cc Thu Mar 17 10:34:27 2016 -0700
@@ -115,7 +115,7 @@
// Strip off the rom address so when the hypervisor is copied into memory
we
// have symbols still
- if (!hypervisor->loadLocalSymbols(debugSymbolTable, 0xFFFFFF))
+ if (!hypervisor->loadLocalSymbols(debugSymbolTable, 0, 0, 0xFFFFFF))
panic("could not load hypervisor symbols\n");
if (!nvram->loadGlobalSymbols(debugSymbolTable))
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/aout_object.cc
--- a/src/base/loader/aout_object.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/aout_object.cc Thu Mar 17 10:34:27 2016 -0700
@@ -80,14 +80,23 @@
bool
-AoutObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
+AoutObject::loadAllSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
+{
+ return false;
+}
+
+bool
+AoutObject::loadGlobalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
// a.out symbols not supported yet
return false;
}
bool
-AoutObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
+AoutObject::loadLocalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
// a.out symbols not supported yet
return false;
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/aout_object.hh
--- a/src/base/loader/aout_object.hh Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/aout_object.hh Thu Mar 17 10:34:27 2016 -0700
@@ -48,10 +48,13 @@
public:
virtual ~AoutObject() {}
- virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max());
- virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max());
+ virtual bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addr_mask = maxAddr);
+ virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0,
+ Addr addr_mask = maxAddr);
+ virtual bool loadLocalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addr_mask = maxAddr);
static ObjectFile *tryFile(const std::string &fname,
size_t len, uint8_t *data);
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/dtb_object.cc
--- a/src/base/loader/dtb_object.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/dtb_object.cc Thu Mar 17 10:34:27 2016 -0700
@@ -171,16 +171,24 @@
return rel_addr;
}
+bool
+DtbObject::loadAllSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
+{
+ return false;
+}
bool
-DtbObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
+DtbObject::loadGlobalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
// nothing to do here
return false;
}
bool
-DtbObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
+DtbObject::loadLocalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
// nothing to do here
return false;
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/dtb_object.hh
--- a/src/base/loader/dtb_object.hh Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/dtb_object.hh Thu Mar 17 10:34:27 2016 -0700
@@ -66,10 +66,12 @@
*/
Addr findReleaseAddr();
- bool loadGlobalSymbols(SymbolTable *symtab,
- Addr addrMask = std::numeric_limits<Addr>::max());
- bool loadLocalSymbols(SymbolTable *symtab,
- Addr addrMask = std::numeric_limits<Addr>::max());
+ bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addrMask = maxAddr);
+ bool loadGlobalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addrMask = maxAddr);
+ bool loadLocalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addrMask = maxAddr);
/** Static function that tries to load file as a
* flattened device tree blob.
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/ecoff_object.cc
--- a/src/base/loader/ecoff_object.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/ecoff_object.cc Thu Mar 17 10:34:27 2016 -0700
@@ -89,9 +89,18 @@
bss.baseAddr, bss.size);
}
+bool
+EcoffObject::loadAllSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
+{
+ bool retval = loadGlobalSymbols(symtab, base, offset, addr_mask);
+ retval = retval && loadLocalSymbols(symtab, base, offset, addr_mask);
+ return retval;
+}
bool
-EcoffObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
+EcoffObject::loadGlobalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
if (!symtab)
return false;
@@ -120,7 +129,8 @@
}
bool
-EcoffObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
+EcoffObject::loadLocalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
if (!symtab)
return false;
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/ecoff_object.hh
--- a/src/base/loader/ecoff_object.hh Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/ecoff_object.hh Thu Mar 17 10:34:27 2016 -0700
@@ -51,10 +51,12 @@
public:
virtual ~EcoffObject() {}
- virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max());
- virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max());
+ virtual bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addr_mask = maxAddr);
+ virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addr_mask = maxAddr);
+ virtual bool loadLocalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr addr_mask = maxAddr);
static ObjectFile *tryFile(const std::string &fname,
size_t len, uint8_t *data);
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/elf_object.cc
--- a/src/base/loader/elf_object.cc Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/elf_object.cc Thu Mar 17 10:34:27 2016 -0700
@@ -396,7 +396,8 @@
bool
-ElfObject::loadSomeSymbols(SymbolTable *symtab, int binding, Addr mask)
+ElfObject::loadSomeSymbols(SymbolTable *symtab, int binding, Addr mask,
+ Addr base, Addr offset)
{
if (!symtab)
return false;
@@ -432,9 +433,11 @@
if (GELF_ST_BIND(sym.st_info) == binding) {
char *sym_name = elf_strptr(elf, shdr.sh_link,
sym.st_name);
if (sym_name && sym_name[0] != '$') {
- DPRINTF(Loader, "Symbol: %-40s value %#x\n",
- sym_name, sym.st_value);
- symtab->insert(sym.st_value & mask, sym_name);
+ Addr value = sym.st_value - base + offset;
+ if (symtab->insert(value & mask, sym_name)) {
+ DPRINTF(Loader, "Symbol: %-40s value %#x\n",
+ sym_name, value);
+ }
}
}
}
@@ -449,23 +452,45 @@
}
bool
-ElfObject::loadGlobalSymbols(SymbolTable *symtab, Addr addr_mask)
+ElfObject::loadAllSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
- return loadSomeSymbols(symtab, STB_GLOBAL, addr_mask);
+ return (loadGlobalSymbols(symtab, base, offset, addr_mask) &&
+ loadLocalSymbols(symtab, base, offset, addr_mask) &&
+ loadWeakSymbols(symtab, base, offset, addr_mask));
}
bool
-ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr addr_mask)
+ElfObject::loadGlobalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
- bool found_local = loadSomeSymbols(symtab, STB_LOCAL, addr_mask);
- bool found_weak = loadSomeSymbols(symtab, STB_WEAK, addr_mask);
- return found_local || found_weak;
+ if (interpreter) {
+ interpreter->loadSomeSymbols(symtab, STB_GLOBAL, addr_mask,
+ base, offset);
+ }
+ return loadSomeSymbols(symtab, STB_GLOBAL, addr_mask, base, offset);
}
bool
-ElfObject::loadWeakSymbols(SymbolTable *symtab, Addr addr_mask)
+ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
{
- return loadSomeSymbols(symtab, STB_WEAK, addr_mask);
+ if (interpreter) {
+ interpreter->loadSomeSymbols(symtab, STB_LOCAL, addr_mask,
+ base, offset);
+ }
+ return loadSomeSymbols(symtab, STB_LOCAL, addr_mask, base, offset);
+}
+
+bool
+ElfObject::loadWeakSymbols(SymbolTable *symtab, Addr base, Addr offset,
+ Addr addr_mask)
+{
+ if (interpreter) {
+ interpreter->loadSomeSymbols(symtab, STB_WEAK, addr_mask,
+ base, offset);
+ }
+ return loadSomeSymbols(symtab, STB_WEAK, addr_mask, base, offset);
}
bool
diff -r 484c04261226 -r 5967db4cff04 src/base/loader/elf_object.hh
--- a/src/base/loader/elf_object.hh Thu Mar 17 10:33:02 2016 -0700
+++ b/src/base/loader/elf_object.hh Thu Mar 17 10:34:27 2016 -0700
@@ -81,7 +81,8 @@
Addr ldMax;
/// Helper functions for loadGlobalSymbols() and loadLocalSymbols().
- bool loadSomeSymbols(SymbolTable *symtab, int binding, Addr mask);
+ bool loadSomeSymbols(SymbolTable *symtab, int binding, Addr mask,
+ Addr base, Addr offset);
ElfObject(const std::string &_filename, size_t _len, uint8_t *_data,
Arch _arch, OpSys _opSys);
@@ -94,15 +95,25 @@
public:
virtual ~ElfObject() {}
- bool loadSections(PortProxy& memProxy,
- Addr addrMask = std::numeric_limits<Addr>::max(),
- Addr offset = 0) override;
- virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max()) override;
- virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max()) override;
- virtual bool loadWeakSymbols(SymbolTable *symtab, Addr addrMask =
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev