从另一个共享库检查缺少的共享库(.so)

时间:2014-07-07 16:31:41

标签: android linux

我有大约500个库,每个库彼此依赖(共享库)

问题是由于缺少依赖库而导致其中一个/几个未能加载,并且我没有关于由于缺少库而导致失败的日志。由于数量很大,我无法使用十六进制编辑器自行分析。这个场景来自Android手机。因此,如果我将所有.so库保存在一个地方,有没有办法编写一个脚本来分析每个库的依赖关系并检查它在给定目录中的存在?

应采用何种方法来执行此操作,因为AFAIK只能使用ldd列出动态可执行文件的共享库。

4 个答案:

答案 0 :(得分:4)

我不完全确定我是否理解正确,但我希望无论如何我的答案对你有帮助。

通常,可以使用" ldd"来检查任何动态链接二进制文件。它基本上显示了动态链接器必须加载到的所有库,以便解析所有外部符号。这适用于库以及可执行文件。如果你使用ldd" -r" flag,ldd将尝试解析所有外部符号,并报告丢失的符号。

然后,您可以轻松地输入" ldd -r"到" grep"并检查缺少的符号。

bash脚本可能如下所示:

find /lib /usr/lib /usr/local/lib -iname "*.so*" | while read lib_name; do
    if ldd -r "$lib_name" 2>&1 | grep -qF "undefined symbol: "; then
        echo "library \"$lib_name\" seems to be broken"
    fi
done

我刚从脑中写下这个,可能包含轻微的synax /输入错误。

正如我之前所说,如果需要,这也适用于可执行文件。

如果您需要扩展库搜索路径,可以使用环境变量" LD_LIBRARY_PATH"为了那个原因。只是做:

export LD_LIBRARY_PATH=/path/to/my/libs

既然你明确指出,那ldd将只会#34;处理动态库: 好吧,静态链接的二进制文件(lib或exe)与其他二进制文件没有依赖关系(Linux内核除外)。所以在这种情况下,我不确定你在找什么......?

答案 1 :(得分:1)

ldd也适用于.so文件

尝试:

cd /usr/lib   
ldd * 

将列出库使用的所有动态.so文件,尝试解析它们,并向您显示任何缺失的内容。

答案 2 :(得分:1)

检查此链接它使用LDD命令。 See

您可以使用它列出所有依赖项

答案 3 :(得分:0)

删除

<uses-library android:name="org.apache.commons.lang"/>

这仅适用于Android项目库而不是普通的旧Jar文件。 Jar文件将通过将它们包含在构建路径中来提取其类并将其放入apk中。