【问题标题】:dlsym returning symbol not found in android after succesful return of dlopendlopen成功返回后,在android中找不到dlsym返回符号
【发布时间】:2010-11-02 12:09:01
【问题描述】:

我正在从另一个加载一个共享库。让我们从 foo1.so 说 foo2.so

我使用的是 dlopen,然后是 dlsym

dlopen 使用正确的句柄成功,但 dlsym 返回“未找到符号”错误。我已使用 dlerror 打印错误。

这些是我尝试过的事情。在 foo2.so .mk 文件中我添加了 LOCAL_LDFLAGS += -Wl,--export-dynamic。

我使用 nm 检查了 foo2.so 中的符号,它就在那里。

这两个模块都在 C 中,除了 foo1.so 中的一个包装文件在 C++ 中,调用文件在 C 中。

任何人都可以建议我是否错过了任何事情。我在 froyo 上的 android 模拟器上运行它。

【问题讨论】:

    标签: android linux


    【解决方案1】:

    我很想在实现级别四处寻找并验证事情。查看 /proc/PID#/maps 并确保两个库都已加载。

    objdump 调用者和被调用者,并确保 C++ 位没有破坏名称。

    您是否使用了合适的 RTLD_ 标志,并且 dlsym 是否获得了 dlopen 返回的有效句柄?

    您能否构建(简化版本)这两个库并测试桌面 linux 或 cygwin 的可执行文件,以确保您想要做的事情通常是可行的 - 即问题是特定于 android 的?

    【讨论】:

    • 在下面输入示例代码 pHndl = dlopen(pTemp, RTLD_NOW); if ((err = dlerror()) != NULL) { LOGE("加载共享库时出错:%s",err); dlerror(); } dlsymRet = (OMX_PTR)dlsym(pHndl,pFuncName); if ((err = dlerror()) != NULL) { LOGE("找不到错误符号:%s",err); }
    • 它返回有效句柄。也尝试了 RTLD_LAZY。调用者和被调用者都驻留在一个 c 文件中,因此它会在剩余的 C++ 文件中命名修改。关于地图文件,我需要检查媒体播放器进程。这段代码在 linux 上完美运行。尝试将 openmax 组件动态加载到我们的核心上。需要检查媒体播放器进程的id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2020-02-01
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多