我有一个libsomething.a
文件,它是一个包含所有依赖项的静态库。
我需要能够在Python中导入它,因为它是一个Python C库。 According to this,无法将静态库用作CPython库。
如何获取.a
文件并将其设为.so
,保留所有静态依赖项?
背景:我正在使用Crowbar构建一个CPython共享库,可以在AWS Lambda中从Python调用。到目前为止,它一直运行良好,但是一旦我添加了需要OpenSSL的依赖项,我在Lambda中运行代码时会遇到链接器问题。
这里的问题是用于执行代码的Amazon Linux映像具有古老的OpenSSL版本。我有recreated the runtime environment,但问题是亚马逊的yum存储库中不再存在旧版本的OpenSSL。这意味着安装openssl-devel
会拉低OpenSSL 1.0.2k,在运行时,提供的OpenSSL版本为1.0.1。
这导致Lambda中的运行时链接失败。因此,我需要一种方法来构建(大多数)静态链接的共享库。我希望我的SO链接的唯一共享库是libc和内核,其他所有内容都是静态编译的。
在Lambda执行环境中,LD_LIBRARY_PATH
设置为/usr/lib64:/lib64:./lib
,因此lib
文件夹中的任何内容都将被加载,但仅作为最后结果,如果我链接到OpenSSL ,我每次都得到错误的版本。
在Rust中,我可以选择生成liblambda.a
或liblambda.so
,一个静态库或共享库。我假设生成*.a
然后转换为仅链接到glibc和内核依赖项的共享库。
答案 0 :(得分:2)
不,你不能从静态库转换为共享库(至少在实践中不做)。阅读Drepper的How To Write Shared Libraries。
其中一个主要原因是共享库需要(几乎需要)position independent code(静态库通常不具备)。
但是,在Linux上,大多数库都是free software。那你为什么不把你的库从源代码重新编译成共享库呢?
(您可能从源代码重新编译特定版本的OpenSSL)