changeset 2285b98847d7 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=2285b98847d7
description:
base: load weak symbols from object file
Without loading weak symbols into gem5, some function names and the
given PC
cannot correspond correctly, because the binding attributes of unction
names
in an ELF file are not only STB_GLOBAL or STB_LOCAL, but also STB_WEAK.
This
patch adds a function for loading weak symbols.
Committed by: Nilay Vaish <[email protected]>
diffstat:
src/base/loader/elf_object.cc | 6 ++++++
src/base/loader/elf_object.hh | 2 ++
src/base/loader/object_file.hh | 3 +++
src/sim/process.cc | 3 ++-
4 files changed, 13 insertions(+), 1 deletions(-)
diffs (54 lines):
diff -r 35198406dd72 -r 2285b98847d7 src/base/loader/elf_object.cc
--- a/src/base/loader/elf_object.cc Wed Apr 17 16:07:10 2013 -0500
+++ b/src/base/loader/elf_object.cc Wed Apr 17 16:07:19 2013 -0500
@@ -415,6 +415,12 @@
}
bool
+ElfObject::loadWeakSymbols(SymbolTable *symtab, Addr addrMask)
+{
+ return loadSomeSymbols(symtab, STB_WEAK, addrMask);
+}
+
+bool
ElfObject::loadSections(PortProxy& memProxy, Addr addrMask)
{
if (!ObjectFile::loadSections(memProxy, addrMask))
diff -r 35198406dd72 -r 2285b98847d7 src/base/loader/elf_object.hh
--- a/src/base/loader/elf_object.hh Wed Apr 17 16:07:10 2013 -0500
+++ b/src/base/loader/elf_object.hh Wed Apr 17 16:07:19 2013 -0500
@@ -71,6 +71,8 @@
std::numeric_limits<Addr>::max());
virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
std::numeric_limits<Addr>::max());
+ virtual bool loadWeakSymbols(SymbolTable *symtab, Addr addrMask =
+ std::numeric_limits<Addr>::max());
virtual bool isDynamic() { return sectionExists(".interp"); }
virtual bool hasTLS() { return sectionExists(".tbss"); }
diff -r 35198406dd72 -r 2285b98847d7 src/base/loader/object_file.hh
--- a/src/base/loader/object_file.hh Wed Apr 17 16:07:10 2013 -0500
+++ b/src/base/loader/object_file.hh Wed Apr 17 16:07:19 2013 -0500
@@ -89,6 +89,9 @@
std::numeric_limits<Addr>::max()) = 0;
virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
std::numeric_limits<Addr>::max()) = 0;
+ virtual bool loadWeakSymbols(SymbolTable *symtab, Addr addrMask =
+ std::numeric_limits<Addr>::max())
+ { return false; }
virtual bool isDynamic() { return false; }
virtual bool hasTLS() { return false; }
diff -r 35198406dd72 -r 2285b98847d7 src/sim/process.cc
--- a/src/sim/process.cc Wed Apr 17 16:07:10 2013 -0500
+++ b/src/sim/process.cc Wed Apr 17 16:07:19 2013 -0500
@@ -574,7 +574,8 @@
if (!debugSymbolTable) {
debugSymbolTable = new SymbolTable();
if (!objFile->loadGlobalSymbols(debugSymbolTable) ||
- !objFile->loadLocalSymbols(debugSymbolTable)) {
+ !objFile->loadLocalSymbols(debugSymbolTable) ||
+ !objFile->loadWeakSymbols(debugSymbolTable)) {
// didn't load any symbols
delete debugSymbolTable;
debugSymbolTable = NULL;
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev