如何在Android上的动态链接器中启用调试输出?

dee*_*sky 5 debugging linker android

背景:

\n\n

我的应用程序无法在链接阶段运行并收到以下消息:

\n\n

link_image[1995]... lib1.so
\n无法链接可执行文件

\n\n

该应用程序依赖于几个动态库,如下所示:

\n\n

app需要lib1,lib1 dlopen lib2,在lib1中有一个由app导出的符号(全局变量)。

\n\n

我已经用一个简单的程序测试了 lib2,这是可以的。所以我认为失败是由于 lib1 在链接阶段造成的。(我可以保证应用程序需要的所有其他库都在当前目录中,并且“./”已添加到 LD_LIBRARY_PATH 中。我还尝试将所有库到/系统/lib)

\n\n

问题:

\n\n
    \n
  1. 如何启用链接器的调试输出以获得详细的错误消息?
  2. \n
  3. 还有其他建议吗?
  4. \n
\n\n

edit1\xef\xbc\x9a\n经过更多测试,似乎链接错误是由于 main.c 中定义的 lib1 引用的全局符号造成的

\n\n

Android 是否需要额外的构建标志来启用 main 中的引用全局变量?

\n

小智 1

你必须重新编译。在此处获取适当的(分支、标签)源:

https://github.com/android/platform_bionic/tree/master/linker

在 Android.mk 中,您希望将其设置为 1:

# Set LINKER_DEBUG to either 1 or 0
#
LOCAL_CFLAGS += -DLINKER_DEBUG=0
Run Code Online (Sandbox Code Playgroud)

如果你想走得更低,请查看 TRACE() 和 DL_ERR()。正如您将看到的,TRACE() 是预处理器定义的,因此是编译出来的。否则,您可以快速修补您自己的 debug_verbosity 值或其检查。