android - 从另一个共享库中检查丢失的共享库 (.so)

标签 android linux

我有一大堆大约 500 个库,每个库都相互依赖(共享库)

问题是它们中的一个/少数由于缺少依赖库而无法加载,而且我没有关于哪个因缺少库而失败的日志。由于数量众多,我无法使用十六进制编辑器自行分析它。这个场景来自安卓手机。因此,如果我将所有 .so 库放在一个地方,是否有任何方法可以编写一个脚本来分析每个库的依赖关系并检查它是否存在于给定目录中?

应该遵循什么方法来执行此操作,因为 AFAIK 可以使用 ldd 仅列出动态可执行文件的共享库。

最佳答案

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

通常任何动态链接的二进制文件都可以用“ldd”检查。它基本上向您展示了动态链接器为解析所有外部符号而必须加载的所有库。这适用于库以及可执行文件。如果您使用 ldd 的“-r”标志,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

我只是在脑海中写下这个,可能包含轻微的语法/打字错误。

正如我之前所说,这也适用于可执行文件,以备不时之需。

如果您需要扩展您的库搜索路径,您可以为此使用环境变量“LD_LIBRARY_PATH”。只是做:

export LD_LIBRARY_PATH=/path/to/my/libs

既然你明确指出,那 ldd 将“只”在动态库上工作: 好吧,静态链接的二进制文件(lib 或 exe)不依赖于其他二进制文件(linux 内核除外)。所以我不确定您在这种情况下要寻找什么...?

关于android - 从另一个共享库中检查丢失的共享库 (.so),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615451/

相关文章:

linux - 使用 awk 或 sed 比较多个文件的长度

java - ANDROID:MVVM + Retrofit:如何以及在哪里从 JSON 对象数组检索 JSON 对象列表?

php - 如何在 Laravel 5 Blade 模板中通过 "use"使用自定义类?

sql-server - MS SQL Server 2019 设置在 Ubuntu 22.04 中失败?

Android-打开软键盘时更改EditText的高度

Linux PCIe DMA 驱动程序 (Xilinx XDMA)

linux - 日期 : extra operand '+%s'

android - 停止包含 LocationManager 的后台服务

Android HttpClient 响应

java - 将库构建为jar文件