base: load weak symbols from object file
authorDeyuan Guo ext:(%2C%20Nilay%20Vaish%20%3Cnilay%40cs.wisc.edu%3E) <guodeyuan@tsinghua.org.cn>
Wed, 17 Apr 2013 21:07:19 +0000 (16:07 -0500)
committerDeyuan Guo ext:(%2C%20Nilay%20Vaish%20%3Cnilay%40cs.wisc.edu%3E) <guodeyuan@tsinghua.org.cn>
Wed, 17 Apr 2013 21:07:19 +0000 (16:07 -0500)
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>

src/base/loader/elf_object.cc
src/base/loader/elf_object.hh
src/base/loader/object_file.hh
src/sim/process.cc

index f6a18db8a3334e9e096ae654c1a58af8268bad87..b6253adbe13453b2030a1162eb26a29f9b6ce2de 100644 (file)
@@ -414,6 +414,12 @@ ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
     return loadSomeSymbols(symtab, STB_LOCAL, addrMask);
 }
 
+bool
+ElfObject::loadWeakSymbols(SymbolTable *symtab, Addr addrMask)
+{
+    return loadSomeSymbols(symtab, STB_WEAK, addrMask);
+}
+
 bool
 ElfObject::loadSections(PortProxy& memProxy, Addr addrMask)
 {
index 350a80db15e7f51404e974eab6a8fd894e4fe439..d3d3e5197d733b960a9f7a022fca9249b122bbbc 100644 (file)
@@ -71,6 +71,8 @@ class ElfObject : public ObjectFile
             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"); }
index 4a789d321b7534adc104215996be56b876e88542..bdc9a31a19c71de564fdcc76ffb3ea8cdd0dc405 100644 (file)
@@ -89,6 +89,9 @@ class ObjectFile
             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; }
index 22a88630324b72a9cabad5d0058e2f334446f6b5..1654ea5c58fc69f508fc54339139c2b9bed3fa7c 100644 (file)
@@ -574,7 +574,8 @@ LiveProcess::LiveProcess(LiveProcessParams * params, ObjectFile *_objFile)
     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;