【问题标题】:LD_PRELOADING dlopen on androidLD_PRELOADING dlopen 在 android 上
【发布时间】: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


【解决方案1】:

Android dlopen 由链接器提供,因此在从预加载库中查找dlopen 符号时需要使用RTLD_DEFAULT。请参阅:bionic/libdl/libdl.cbionic/linker/linker.cpp

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多