bugfixes
This commit is contained in:
parent
cad600fd59
commit
a72ba8066c
|
@ -14,7 +14,7 @@ static int g_base_address_calculated = 0;
|
||||||
|
|
||||||
|
|
||||||
// base address calculatiion
|
// base address calculatiion
|
||||||
static void calculate_base_address(void* known_runtime_addr, uintptr_t known_elf_addr){
|
static void calculate_base_address_offset(void* known_runtime_addr, uintptr_t known_elf_addr){
|
||||||
if (g_base_address_calculated) return;
|
if (g_base_address_calculated) return;
|
||||||
|
|
||||||
uintptr_t runtime_addr = (uintptr_t)known_runtime_addr;
|
uintptr_t runtime_addr = (uintptr_t)known_runtime_addr;
|
||||||
|
@ -94,7 +94,7 @@ static int parse_elf_symbols(const char* filepath){
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char* elf_data = (unsigned char*)mapped;
|
unsigned char* elf_data = (unsigned char*)mapped;
|
||||||
if (elf_data[0] != 0x7f || elf_data[1] != 'E' || elf_data[2] != 'L' || elf_data != 'F'){
|
if (elf_data[0] != 0x7f || elf_data[1] != 'E' || elf_data[2] != 'L' || elf_data[3] != 'F'){
|
||||||
// not an ELF file
|
// not an ELF file
|
||||||
munmap(mapped, st.st_size);
|
munmap(mapped, st.st_size);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -227,7 +227,7 @@ static int parse_elf_symbols(const char* filepath){
|
||||||
|
|
||||||
// sort symbols by address for quick binary search
|
// sort symbols by address for quick binary search
|
||||||
if (g_rvprof.symbols.size > 0){
|
if (g_rvprof.symbols.size > 0){
|
||||||
qsort(g_rvprof.symbols.data, g_rvprof.symbols.size, sizeof(symbol_entry_t), symbol_compare);
|
qsort(g_rvprof.symbols.data, g_rvprof.symbols.size, sizeof(symbol_entry_t), compare_symbol);
|
||||||
g_rvprof.symbols_loaded = 1;
|
g_rvprof.symbols_loaded = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,21 +309,21 @@ const char* rvprof_symbols_lookup(void* addr){
|
||||||
// if symbol has size info, check if address is within range
|
// if symbol has size info, check if address is within range
|
||||||
if (sym->size > 0) {
|
if (sym->size > 0) {
|
||||||
if (adjusted_addr >= sym->addr && adjusted_addr < sym->addr + sym->size){
|
if (adjusted_addr >= sym->addr && adjusted_addr < sym->addr + sym->size){
|
||||||
strncpy(g_temp_func_name, sym->name, sizeof(g_temp_func_name) - 1);
|
strncpy(g_tmp_func_name, sym->name, sizeof(g_tmp_func_name) - 1);
|
||||||
g_temp_func_name[sizeof(g_temp_func_name) - 1] = '\0';
|
g_tmp_func_name[sizeof(g_tmp_func_name) - 1] = '\0';
|
||||||
return g_temp_func_name;
|
return g_tmp_func_name;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// no size info, use 64 KB heuristic: must be within reasonable range
|
// no size info, use 64 KB heuristic: must be within reasonable range
|
||||||
if (adjusted_addr >= sym->addr && (adjusted_addr - sym->addr) < 0x10000){
|
if (adjusted_addr >= sym->addr && (adjusted_addr - sym->addr) < 0x10000){
|
||||||
strncpy(g_temp_func_name, sym->name, sizeof(g_temp_func_name) - 1);
|
strncpy(g_tmp_func_name, sym->name, sizeof(g_tmp_func_name) - 1);
|
||||||
g_temp_func_name[sizeof(g_temp_func_name) - 1] = '\0';
|
g_tmp_func_name[sizeof(g_tmp_func_name) - 1] = '\0';
|
||||||
return g_temp_func_name;
|
return g_tmp_func_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallback to addresses if we cannot resolve symbols
|
// fallback to addresses if we cannot resolve symbols
|
||||||
snprintf(g_temp_func_name, sizeof(g_temp_func_name), "func_%p", addr);
|
snprintf(g_tmp_func_name, sizeof(g_tmp_func_name), "func_%p", addr);
|
||||||
return g_temp_func_name;
|
return g_tmp_func_name;
|
||||||
}
|
}
|
Loading…
Reference in New Issue