linux - 将静态库转换为动态库

标签 linux libc

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

最佳答案

不,您不能进行从静态库到共享库的转换(至少在实践中不能)。阅读How To Write Shared Libraries由 Drepper 提供。

主要原因之一是共享库希望(它几乎需要)拥有 position independent code (静态库通常没有)。

然而,在 Linux 上大多数库都是 free software .那么,为什么不将您的库从源代码重新编译到共享库中呢?

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

关于linux - 将静态库转换为动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49262694/

相关文章:

linux - Unix 测试文件是否存在

linux - 隐藏 expect 的输出

documentation - 哪里可以在线浏览 libc 的源代码(比如 doxygen)

c - Unix 上的 IsBadReadPtr 模拟

linux - 如何检查 Ubuntu 上是否存在预构建包

linux - sed - 使用数组构建正则表达式

linux - 在 python 2.7 中编码/解码特殊字符

linux - getppid 是指父级还是真正的父级?

c - gets() 函数和输入中的 '\0' 零字节

c - "statically allocated"在 libc 中到底意味着什么?每个库实例一个?每个程序实例一个?