我有一个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,但问题是旧版本的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
,然后转换成一个共享库,只链接到glibc和内核依赖项。
最佳答案
不,不能从静态库转换为共享库(至少在实践中是这样)。读dreper的How To Write Shared Libraries。
其中一个主要原因是共享库希望(它几乎需要)有position independent code(静态库通常没有)。
但是,在linux上,大多数库都是free software。那么,为什么不将源代码中的库重新编译为共享库呢?
(您也许可以从源代码重新编译该特定版本的openssl)
关于linux - 将静态库转换为动态库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49262694/