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 <nilay@cs.wisc.edu>
diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc
index f6a18db..b6253ad 100644
--- a/src/base/loader/elf_object.cc
+++ b/src/base/loader/elf_object.cc
@@ -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 --git a/src/base/loader/elf_object.hh b/src/base/loader/elf_object.hh
index 350a80d..d3d3e51 100644
--- a/src/base/loader/elf_object.hh
+++ b/src/base/loader/elf_object.hh
@@ -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 --git a/src/base/loader/object_file.hh b/src/base/loader/object_file.hh
index 4a789d3..bdc9a31 100644
--- a/src/base/loader/object_file.hh
+++ b/src/base/loader/object_file.hh
@@ -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 --git a/src/sim/process.cc b/src/sim/process.cc
index 22a8863..1654ea5 100644
--- a/src/sim/process.cc
+++ b/src/sim/process.cc
@@ -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;