Android上的ldd相当于什么?

23

我有一个libTest.so文件,但某些设备无法加载它,logcat没有任何有用的信息。 使用arm-linux-androideabi-readelf.exe -d libTest.so工具,我能够看到libTest.so所需的所有必要库。我将它们全部拉入到本地PC上相同的文件夹中。

我该如何找出缺失的符号及其所在的库?我只有NDK中的标准工具(nm、readelf、objdump等)。使用哪个工具以及如何使用它,才能使其解析我的libTest.so以及所有依赖库,并告诉我哪个符号阻止了我的库在目标设备上的加载。


<NDK_DIR>/toolchains/llvm/prebuild/<HOST_OS>/bin/<ARCH>-strings | grep ^lib | grep so - yerlilbilgin
4个回答

22
如果你没有 NDK,请尝试执行以下操作:
readelf --dynamic filename | grep NEEDED

显示 ELF 二进制文件的动态库。


21
感谢安卓开发者。我的功能请求已被实现 :) 现在我们有了一个名为ndk-depends的工具,可以用于故障排除依赖项。
编辑:它并不完全解析符号。例如,如果您构建为Android-14,并尝试使用旧的Android中不存在的方法,则此工具不会列出缺少的符号。这部分在ndk-depends中留作待办事项。

1
不幸的是,ndk-depends在ndk r19中已被删除:https://github.com/android/ndk/wiki/Changelog-r19#announcements - Bruno Alexandre Rosa

6

0
你可以这样做:
$ /lib/ld-linux.so.2 --list filename

这是因为ldd只是一个外壳脚本,它像包装器一样工作在动态加载器周围。动态加载器的名称,即ld-{version}.so可能会有所不同。


4
Android似乎使用/system/bin/linker而不是/lib/ld-linux.so。但无论如何,我无法让链接器输出任何内容。 - Dima Tisnek
7
无论使用什么参数,当我直接调用/system/bin/linker时,只会收到“分段错误(Segmentation fault)”的提示! - markshep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接