static drsym_error_t drsym_enumerate_symbols_local(const char *modpath, drsym_enumerate_cb callback, drsym_enumerate_ex_cb callback_ex, size_t info_size, void *data, uint flags) { void *mod; drsym_error_t r; if (modpath == NULL || (callback == NULL && callback_ex == NULL)) return DRSYM_ERROR_INVALID_PARAMETER; dr_recurlock_lock(symbol_lock); mod = lookup_or_load(modpath); if (mod == NULL) { dr_recurlock_unlock(symbol_lock); return DRSYM_ERROR_LOAD_FAILED; } recursive_context = true; r = drsym_unix_enumerate_symbols(mod, callback, callback_ex, info_size, data, flags); recursive_context = false; dr_recurlock_unlock(symbol_lock); return r; }
drmf_status_t drsyscall_os_init(void *drcontext) { uint i; hashtable_init_ex(&systable, SYSTABLE_HASH_BITS, HASH_INTPTR, false/*!strdup*/, false/*!synch*/, NULL, sysnum_hash, sysnum_cmp); /* We initialize & leave secondary_systable empty to be in sync with our * Windows & Linux solutions. Xref i#1438 i#1549. */ hashtable_init_ex(&secondary_systable, SECONDARY_SYSTABLE_HASH_BITS, HASH_INTPTR, false/*!strdup*/, false/*!synch*/, NULL, sysnum_hash, sysnum_cmp); hashtable_init(&name2num_table, NAME2NUM_TABLE_HASH_BITS, HASH_STRING, false/*!strdup*/); dr_recurlock_lock(systable_lock); for (i = 0; i < count_syscall_info_bsd; i++) { IF_DEBUG(bool ok =) hashtable_add(&systable, (void *) &syscall_info_bsd[i].num, (void *) &syscall_info_bsd[i]); ASSERT(ok, "no dups"); IF_DEBUG(ok =) hashtable_add(&name2num_table, (void *) syscall_info_bsd[i].name, (void *) &syscall_info_bsd[i].num); ASSERT(ok || strcmp(syscall_info_bsd[i].name, "ni_syscall") == 0, "no dups"); } dr_recurlock_unlock(systable_lock); return DRMF_SUCCESS; }