【问题标题】:Convert Static Lib to Dynamic将静态库转换为动态库
【发布时间】: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.aliblambda.so,静态库或共享库。我假设生成*.a,然后转换为仅链接到 glibc 和内核依赖项的共享库。

【问题讨论】:

  • 你是怎么得到那个库的?它在做什么?

标签: linux libc


【解决方案1】:

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

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

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

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

【讨论】:

  • 我已经更新了我的问题,提供了有关我的构建环境以及出现问题的具体情况的更多信息。
  • PIC 不是语言问题。
猜你喜欢
  • 2013-04-11
  • 2011-02-04
  • 2011-01-24
  • 2011-05-26
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多