mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2025-02-16 18:21:41 +01:00
eh_elf: handle properly reinit
This commit is contained in:
parent
1493c0ca4b
commit
96ed4c4d82
1 changed files with 17 additions and 8 deletions
|
@ -46,6 +46,8 @@ int mmap_init_pid(pid_t pid) {
|
||||||
int mmap_init_procdir(const char* procdir) {
|
int mmap_init_procdir(const char* procdir) {
|
||||||
// This function reads /proc/pid/maps and deduces the memory map
|
// This function reads /proc/pid/maps and deduces the memory map
|
||||||
|
|
||||||
|
mmap_clear();
|
||||||
|
|
||||||
// Open the mmap file
|
// Open the mmap file
|
||||||
char map_path[128];
|
char map_path[128];
|
||||||
sprintf(map_path, "%s/maps", procdir);
|
sprintf(map_path, "%s/maps", procdir);
|
||||||
|
@ -123,21 +125,24 @@ int mmap_init_procdir(const char* procdir) {
|
||||||
int mmap_init_mmap(unw_mmap_entry_t* entries, size_t count) {
|
int mmap_init_mmap(unw_mmap_entry_t* entries, size_t count) {
|
||||||
Debug(3, "Start reading mmap (entries=%016lx)\n", (uintptr_t)entries);
|
Debug(3, "Start reading mmap (entries=%016lx)\n", (uintptr_t)entries);
|
||||||
Debug(3, "%lu entries\n", count);
|
Debug(3, "%lu entries\n", count);
|
||||||
|
|
||||||
|
mmap_clear();
|
||||||
|
|
||||||
_memory_map = (mmap_entry_t*) calloc(count, sizeof(mmap_entry_t));
|
_memory_map = (mmap_entry_t*) calloc(count, sizeof(mmap_entry_t));
|
||||||
_memory_map_size = count;
|
_memory_map_size = count;
|
||||||
|
|
||||||
int mmap_pos = 0;
|
int mmap_pos = 0;
|
||||||
for(int pos=0; pos < (int)count; ++pos) {
|
for(int pos=0; pos < (int)count; ++pos) {
|
||||||
Debug(3, "> MMAP %016lx-%016lx %s\n",
|
|
||||||
entries[pos].beg_ip,
|
|
||||||
entries[pos].end_ip,
|
|
||||||
entries[pos].object_name);
|
|
||||||
|
|
||||||
if(entries[pos].object_name[0] == '[') {
|
if(entries[pos].object_name[0] == '[') {
|
||||||
// Special entry (stack,vdso, …)
|
// Special entry (stack,vdso, …)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug(3, "> MMAP %016lx-%016lx %s\n",
|
||||||
|
entries[pos].beg_ip,
|
||||||
|
entries[pos].end_ip,
|
||||||
|
entries[pos].object_name);
|
||||||
|
|
||||||
_memory_map[mmap_pos].id = pos;
|
_memory_map[mmap_pos].id = pos;
|
||||||
_memory_map[mmap_pos].offset = entries[pos].offset;
|
_memory_map[mmap_pos].offset = entries[pos].offset;
|
||||||
_memory_map[mmap_pos].beg_ip = entries[pos].beg_ip;
|
_memory_map[mmap_pos].beg_ip = entries[pos].beg_ip;
|
||||||
|
@ -158,7 +163,9 @@ int mmap_init_mmap(unw_mmap_entry_t* entries, size_t count) {
|
||||||
return -3;
|
return -3;
|
||||||
if(mmap_dlopen_eh_elfs(_memory_map, _memory_map_size) < 0)
|
if(mmap_dlopen_eh_elfs(_memory_map, _memory_map_size) < 0)
|
||||||
return -4;
|
return -4;
|
||||||
Debug(3, "Init complete");
|
|
||||||
|
_mmap_init_done = 1;
|
||||||
|
Debug(3, "Init complete\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,9 +217,11 @@ static int bsearch_compar_mmap_entry(const void* vkey, const void* vmmap_elt) {
|
||||||
mmap_entry_t* mmap_get_entry(uintptr_t ip) {
|
mmap_entry_t* mmap_get_entry(uintptr_t ip) {
|
||||||
// Perform a binary search to find the requested ip
|
// Perform a binary search to find the requested ip
|
||||||
|
|
||||||
if(!_mmap_init_done)
|
Debug(3, "Getting mmap entry %016lx\n", ip);
|
||||||
|
if(!_mmap_init_done) {
|
||||||
|
Debug(1, "Mmap access before init! Aborting\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return bsearch(
|
return bsearch(
|
||||||
(void*)&ip,
|
(void*)&ip,
|
||||||
(void*)_memory_map,
|
(void*)_memory_map,
|
||||||
|
|
Loading…
Add table
Reference in a new issue