int dladdr(const void* addr, Dl_info* info) { ScopedPthreadMutexLocker locker(&g_dl_mutex); // Determine if this address can be found in any library currently mapped. soinfo* si = find_containing_library(addr); if (si == nullptr) { return 0; } memset(info, 0, sizeof(Dl_info)); info->dli_fname = si->name; // Address at which the shared object is loaded. info->dli_fbase = reinterpret_cast<void*>(si->base); // Determine if any symbol in the library contains the specified address. ElfW(Sym)* sym = dladdr_find_symbol(si, addr); if (sym != nullptr) { info->dli_sname = si->get_string(sym->st_name); info->dli_saddr = reinterpret_cast<void*>(si->resolve_symbol_address(sym)); } return 1; }
int dladdr(const void* addr, Dl_info* info) { ScopedPthreadMutexLocker locker(&gDlMutex); // Determine if this address can be found in any library currently mapped. soinfo* si = find_containing_library(addr); if (si == NULL) { return 0; } memset(info, 0, sizeof(Dl_info)); info->dli_fname = si->name; // Address at which the shared object is loaded. info->dli_fbase = (void*) si->base; // Determine if any symbol in the library contains the specified address. Elf32_Sym *sym = dladdr_find_symbol(si, addr); if (sym != NULL) { info->dli_sname = si->strtab + sym->st_name; info->dli_saddr = (void*)(si->load_bias + sym->st_value); } return 1; }