gpt4 book ai didi

Linux 共享对象库链接

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:02 25 4
gpt4 key购买 nike

我有一个我想使用的库。我没有它的源代码,但它包含一个我想使用的函数。它是一个普通的 x86-64 共享对象,里面有一些 JNI 代码,没有什么特别的。我现在的问题是库引用了 libm.so。现在发生的事情很奇怪,我没想到。当我尝试运行它时,它告诉我 libm.so 有一个无效的 ELF header ,这是有道理的,因为 libm.so 只是 的引用文件>libm.so.6 这是实际的库文件。

现在我的问题是如何纠正它?我真的很惊讶操作系统没有正确处理这个问题,因为每个程序都会引用 libm.so 而不是 libm.so.6 因为它应该在至少在某种程度上独立于版本。

编辑: 我做了一个 stracelibm.so 似乎只是冰山一角......我的库正在引用许多常见的 linux 标准库。因为我在 JRE 中执行它,它只在 JRE 的目录中搜索,这当然是完全错误的。而且由于该库是从 Android 应用程序中获取的,因此原始 makefile 可能包含库的路径,这些路径也没有意义……必须对这个问题进行更多分析才能解决。

最佳答案

导入应该是 libm.so.6。只应在编译时导入 libm.so。生成的 ELF 应该导入前者。

这称为 ABI 版本。这是为了确保如果您链接某个版本的库,您只会获得与您链接的版本兼容的实际导入。关于该数字何时更改有一些复杂的规则(有关详细信息,请参阅 soname)。

遗憾的是,您还没有提出任何实际问题。这并不能解释导入失败的原因。如果 ELF header 错误,那么您可能正在错误的位置寻找它(更准确地说,发送 ld.so 来寻找它)。

我会使用 strace 运行我的代码,以查看实际打开了哪些文件。然后,在其上运行 file 以查看平台匹配(可能 64 位可执行文件正在尝试打开 32 位库,反之亦然)。

关于Linux 共享对象库链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37165516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com