【发布时间】:2015-06-10 23:11:06
【问题描述】:
为了获得人类可读的回溯,我需要将我的 SO 与 libbfd 链接起来。
针对 libbfd.a 的静态链接失败,因为它不是用 -fPIC 编译的,所以据我了解,它只能参与可执行文件。
虽然链接到 libbfd.so 也会带来一些麻烦。
我需要在 Ubuntu-14.04 和 Debian Wheezy 7.8 上编译 他们有不相交的 binutils 版本集。特别是 Ubuntu 有 2.24,Debian 有 2.22 和 2.25。问题是,gcc 不想使用符号链接的名称 libbfd.so 来引用它,而是使用 SONAME。所以我在依赖项中以 libbfd-2.24-system.so 或 libbfd-2.25-system.so 结尾。
目前我看到了几种方法:
有一些隐藏标志允许在链接期间覆盖 SONAME。这是首选路径
除了手动编译 libbfd 之外,我别无他法。我会尽量避免。
手动 dlopen+dlsym 满足我的一切需求。
我阅读了答案gcc link shared library against symbolic link,但它建议更改 SONAME 我无法做到。
有什么建议吗?
谢谢。
编辑:似乎 Ubuntu 存储库中的几乎所有静态库都不是与位置无关的。猜不透为什么。由于无法覆盖 SONAME,这会使事情变得更加复杂。
【问题讨论】:
-
好吧,对我来说使用
g++ loader.cc -lbfd有效。链接器标志 -lbfd 指定针对 libbfd 的链接。