Linux共享对象库链接

时间:2016-05-11 14:22:06

标签: linux shared-libraries elf

我有一个我想要使用的库。我没有源代码,但它包含我想要使用的功能。它是一个普通的x86-64共享对象,其中包含一些JNI代码,没有什么特别之处。我现在的问题是库引用了$(document).ready(function(){ $('.materialboxed').materialbox(); }); 。现在发生的事情很奇怪,我没想到。当我尝试运行它时,它告诉我libm.so有一个无效的ELF标头,这是有道理的,因为libm.so只是libm.so的参考文件,它是实际的库文件。

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

编辑:我做了libm.so.6strace似乎只是冰山一角......我的库引用了很多常见的linux标准库。而且由于我在JRE中执行它,它只搜索JRE的目录,当然这完全是错误的。并且由于该库是从Android应用程序中获取的,因此原始的makefile可能具有无法理解的库的路径......要对要解决的问题进行更多分析。

1 个答案:

答案 0 :(得分:0)

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

这称为ABI版本。这是为了确保如果您与某个版本的库链接,那么您只能获得与您链接的版本兼容的实际导入。关于该数字何时发生变化,有一些复杂的规则(更多细节见soname)。

可悲的是,你没有问过任何实际问题。这并不能解释导入失败的原因。如果ELF标题错误,那么你可能正在寻找它(更确切地说,发送ld.so来寻找它)在错误的地方。

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