void *__wrap_dlsym(void *handle, const char *symbol) { if (extractLibs) return dlsym(handle, symbol); soinfo *found; Elf32_Sym *sym; unsigned bind; pthread_mutex_lock(&dl_lock); if(unlikely(handle == 0)) { set_dlerror(DL_ERR_INVALID_LIBRARY_HANDLE); goto err; } if(unlikely(symbol == 0)) { set_dlerror(DL_ERR_BAD_SYMBOL_NAME); goto err; } if(handle == RTLD_DEFAULT) { sym = lookup(symbol, &found, NULL); } else if(handle == RTLD_NEXT) { void *ret_addr = __builtin_return_address(0); soinfo *si = find_containing_library(ret_addr); sym = NULL; if(si && si->next) { sym = lookup(symbol, &found, si->next); } } else { found = (soinfo*)handle; sym = lookup_in_library(found, symbol); } if(likely(sym != 0)) { bind = ELF32_ST_BIND(sym->st_info); if(likely((bind == STB_GLOBAL) && (sym->st_shndx != 0))) { unsigned ret = sym->st_value + found->base; pthread_mutex_unlock(&dl_lock); return (void*)ret; } set_dlerror(DL_ERR_SYMBOL_NOT_GLOBAL); } else set_dlerror(DL_ERR_SYMBOL_NOT_FOUND); err: pthread_mutex_unlock(&dl_lock); return 0; }
void *dlsym(void *handle, const char *symbol) { soinfo *found; Elf32_Sym *sym; unsigned bind; pthread_mutex_lock(&dl_lock); if(unlikely(handle == 0)) { set_dlerror(DL_ERR_INVALID_LIBRARY_HANDLE); goto err; } if(unlikely(symbol == 0)) { set_dlerror(DL_ERR_BAD_SYMBOL_NAME); goto err; } if(handle == RTLD_DEFAULT) { sym = lookup(symbol, &found); } else if(handle == RTLD_NEXT) { sym = lookup(symbol, &found); } else { found = (soinfo*)handle; sym = lookup_in_library(found, symbol); } if(likely(sym != 0)) { bind = ELF32_ST_BIND(sym->st_info); if(likely((bind == STB_GLOBAL) && (sym->st_shndx != 0))) { unsigned ret = sym->st_value + found->base; pthread_mutex_unlock(&dl_lock); return (void*)ret; } set_dlerror(DL_ERR_SYMBOL_NOT_GLOBAL); } else set_dlerror(DL_ERR_SYMBOL_NOT_FOUND); err: pthread_mutex_unlock(&dl_lock); return 0; }
void *dlopen(const char *filename, int flag) { soinfo *ret; pthread_mutex_lock(&dl_lock); ret = find_library(filename); if (unlikely(ret == NULL)) { set_dlerror(DL_ERR_CANNOT_LOAD_LIBRARY); } else { ret->refcount++; } pthread_mutex_unlock(&dl_lock); return ret; }
void *moz_mapped_dlopen(const char *filename, int flag, int fd, void *mem, unsigned int len, unsigned int offset) { soinfo *ret; pthread_mutex_lock(&dl_lock); ret = find_mapped_library(filename, fd, mem, len, offset); if (unlikely(ret == NULL)) { set_dlerror(DL_ERR_CANNOT_LOAD_LIBRARY); } else { ret->refcount++; } pthread_mutex_unlock(&dl_lock); return ret; }
void *android_dlsym(void *handle, const char *symbol) { soinfo *found; Elf32_Sym *sym; unsigned bind; pthread_mutex_lock(&dl_lock); if(unlikely(handle == 0)) { set_dlerror(DL_ERR_INVALID_LIBRARY_HANDLE); goto err; } if(unlikely(symbol == 0)) { set_dlerror(DL_ERR_BAD_SYMBOL_NAME); goto err; } void *sym_addr; if(0 != (sym_addr = get_hooked_symbol_dlfcn(handle, symbol))) { LINKER_DEBUG_PRINTF("symbol %s hooked to %x\n",symbol,sym_addr); pthread_mutex_unlock(&dl_lock); return sym_addr; } if (is_builtin_lib_handle(handle)) { /* must be hooked.. */ set_dlerror(DL_ERR_SYMBOL_NOT_FOUND); goto err; } if(handle == RTLD_DEFAULT) { sym = lookup(symbol, &found, NULL); } else if(handle == RTLD_NEXT) { void *ret_addr = __builtin_return_address(0); soinfo *si = find_containing_library(ret_addr); sym = NULL; if(si && si->next) { sym = lookup(symbol, &found, si->next); } } else { found = (soinfo*)handle; sym = lookup_in_library(found, symbol); } if(likely(sym != 0)) { bind = ELF32_ST_BIND(sym->st_info); if(likely((bind == STB_GLOBAL) && (sym->st_shndx != 0))) { unsigned ret = sym->st_value + found->base; pthread_mutex_unlock(&dl_lock); return create_wrapper((char*)symbol, (void*)ret, WRAPPER_DYNHOOK); } set_dlerror(DL_ERR_SYMBOL_NOT_GLOBAL); } else set_dlerror(DL_ERR_SYMBOL_NOT_FOUND); err: LINKER_DEBUG_PRINTF("symbol %s has not been hooked\n",symbol); pthread_mutex_unlock(&dl_lock); return 0; }