将Static Lib转换为Dynamic

时间:2018-03-13 17:50:22

标签: linux libc

我有一个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.aliblambda.so,一个静态库或共享库。我假设生成*.a然后转换为仅链接到glibc和内核依赖项的共享库。

1 个答案:

答案 0 :(得分:2)

不,你不能从静态库转换为共享库(至少在实践中不做)。阅读Drepper的How To Write Shared Libraries

其中一个主要原因是共享库需要(几乎需要)position independent code(静态库通常不具备)。

但是,在Linux上,大多数库都是free software。那你为什么不把你的库从源代码重新编译成共享库呢?

(您可能从源代码重新编译特定版本的OpenSSL)