sym->offset = 0x0;
const char *original_module = nullptr;
+ uint64_t offset;
for (Module &mod : modules_) {
- if (mod.contains(addr)) {
- bool res = mod.find_addr(addr, sym);
+ if (mod.contains(addr, offset)) {
+ bool res = mod.find_addr(offset, sym);
if (demangle) {
if (sym->name)
sym->demangle_name =
std::sort(syms_.begin(), syms_.end());
}
-bool ProcSyms::Module::contains(uint64_t addr) const {
- for (const auto &range : ranges_) {
- if (addr >= range.start && addr < range.end)
+bool ProcSyms::Module::contains(uint64_t addr, uint64_t &offset) const {
+ for (const auto &range : ranges_)
+ if (addr >= range.start && addr < range.end) {
+ offset = type_ == ModuleType::SO ? addr - range.start : addr;
return true;
- }
+ }
return false;
}
return false;
}
-bool ProcSyms::Module::find_addr(uint64_t addr, struct bcc_symbol *sym) {
- uint64_t offset = type_ == ModuleType::SO ? (addr - start()) : addr;
-
+bool ProcSyms::Module::find_addr(uint64_t offset, struct bcc_symbol *sym) {
load_sym_table();
sym->module = name_.c_str();
std::vector<Symbol> syms_;
void load_sym_table();
- bool contains(uint64_t addr) const;
+ bool contains(uint64_t addr, uint64_t &offset) const;
uint64_t start() const { return ranges_.begin()->start; }
- bool find_addr(uint64_t addr, struct bcc_symbol *sym);
+ bool find_addr(uint64_t offset, struct bcc_symbol *sym);
bool find_name(const char *symname, uint64_t *addr);
static int _add_symbol(const char *symname, uint64_t start, uint64_t end,