【发布时间】:2018-03-14 02:18:58
【问题描述】:
我有一个libsomething.a 文件,它是一个包含所有依赖项的静态库。
我需要能够在 Python 中导入它,因为它是一个 Python C 库。 According to this,不能将静态库用作CPython库。
如何获取我的.a 文件并将其设为.so,同时保留所有静态依赖项?
背景:我正在使用Crowbar 构建一个可以从AWS Lambda 中的Python 调用的CPython 共享库。到现在为止,它运行得完美无缺,但是一旦我添加了需要 OpenSSL 的依赖项,我在 Lambda 中运行代码时就会遇到链接器问题。
这里的问题是用于执行代码的 Amazon Linux 映像具有古老的 OpenSSL 版本。我有recreated the runtime environment,但问题是旧版本的 OpenSSL 不再存在于亚马逊的 yum 存储库中。这意味着安装 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 和内核依赖项的共享库。
【问题讨论】:
-
你是怎么得到那个库的?它在做什么?