【发布时间】:2015-06-11 06:14:27
【问题描述】:
我很好奇我的应用在运行时使用了哪些库和系统调用。因此我开始使用 LD_PRELOAD 和一些“系统调用”(如打开、访问和写入)调查我的应用。
但是,当我尝试预加载 dlopen 以找出加载了哪些库时,我收到了这个错误:找不到符号:
void* dlopen(const char *file, int mode){
static void* (*o_dlopen) ( const char *file, int mode )=0;
printf( "dlopen was called\n" );
o_dlopen = (void*(*)(const char *file, int mode))
dlsym(RTLD_NEXT,"dlopen");
return (*o_dlopen)( file, mode );
}
dlsym 似乎第二次找不到 dlopen 了。我用 -ldl 和 android NDK 提供的 arm-gcc 编译了我的预加载 *.so 文件。使用 -rdynamic 也不起作用。
预加载工作正常,但不适用于 dlopen。或许你能帮帮我……
提前致谢
【问题讨论】:
-
您正在通过
dlopen在您的.so 文件中调用dlopen函数?你应该按照步骤去做,dlopen->dlsym->dlclose -
并非如此。我在我的 *.so 文件中创建了一个 dlopen 来拦截“真正的”dlopen。然后我使用 LD_Preload 将我的 so 文件包装在我的应用程序周围。我的问题是我无法通过 dlsym(RTLD_NEXT, "dlopen") 调用真正的 dlopen。我刚发现一个错误符号未找到。
标签: android c gcc android-ndk ld-preload