diff options
Diffstat (limited to 'source/ucli/symbol.cc')
| -rw-r--r-- | source/ucli/symbol.cc | 12 |
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 { |
