summaryrefslogtreecommitdiff
path: root/source/ucli/symbol.cc
diff options
context:
space:
mode:
Diffstat (limited to 'source/ucli/symbol.cc')
-rw-r--r--source/ucli/symbol.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/source/ucli/symbol.cc b/source/ucli/symbol.cc
index c07cfe2..0db5426 100644
--- a/source/ucli/symbol.cc
+++ b/source/ucli/symbol.cc
@@ -145,6 +145,7 @@ bool symbol_parser::get_symbol_info(int pid, symbol &sym, elf_file &file) {
file.reset(area.name);
if (file.type != JIT_TYPE) {
sym.reset(area.map(sym.ip));
+ sym.base = area.start; // add base address
}
return true;
@@ -173,6 +174,7 @@ bool symbol_parser::putin_symbol_cache(int tgid, unsigned long addr,
}
bool search_symbol(const std::set<symbol> &ss, symbol &sym) {
+ // printf("search symbol2 0x%lx\n", sym.ip);
std::set<symbol>::const_iterator it = ss.find(sym);
if (it != ss.end()) {
@@ -186,7 +188,7 @@ bool search_symbol(const std::set<symbol> &ss, symbol &sym) {
return false;
}
-bool symbol_parser::load_elf(pid_t pid, const elf_file &file) {
+bool symbol_parser::load_elf(pid_t pid, const elf_file &file, size_t file_base_addr) {
std::map<elf_file, std::set<symbol> >::iterator it;
it = file_symbols.find(file);
std::set<symbol> tmp;
@@ -194,7 +196,8 @@ bool symbol_parser::load_elf(pid_t pid, const elf_file &file) {
if (it != file_symbols.end()) {
return true;
}
- if (get_symbol_from_elf(syms, file.filename.c_str())) {
+ if (get_symbol_from_elf(syms, file.filename.c_str(), file_base_addr)) {
+ // printf("load elf %s\n", file.filename.c_str());
file_symbols.insert(make_pair(file, std::move(syms)));
return true;
}
@@ -206,10 +209,13 @@ bool symbol_parser::find_elf_symbol(symbol &sym, const elf_file &file, int pid,
std::map<elf_file, std::set<symbol> >::iterator it;
it = file_symbols.find(file);
std::set<symbol> ss;
+ // printf("search symbol1 0x%lx, base 0x%lx\n", sym.ip, sym.base);
if (it == file_symbols.end()) {
- if (!load_elf(pid, file)) {
+ if (!load_elf(pid, file, sym.base)) {
+ // printf("load elf %s failed\n", file.filename.c_str());
return false;
}
+ // printf("load elf %s success\n", file.filename.c_str());
it = file_symbols.find(file);
return search_symbol(it->second, sym);
} else {