【问题标题】:link SO against libbfd将 SO 链接到 libbfd
【发布时间】: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 结尾。

目前我看到了几种方法:

  1. 有一些隐藏标志允许在链接期间覆盖 SONAME。这是首选路径

  2. 除了手动编译 libbfd 之外,我别无他法。我会尽量避免。

  3. 手动 dlopen+dlsym 满足我的一切需求。

我阅读了答案gcc link shared library against symbolic link,但它建议更改 SONAME 我无法做到。

有什么建议吗?

谢谢。

编辑:似乎 Ubuntu 存储库中的几乎所有静态库都不是与位置无关的。猜不透为什么。由于无法覆盖 SONAME,这会使事情变得更加复杂。

【问题讨论】:

  • 好吧,对我来说使用g++ loader.cc -lbfd 有效。链接器标志 -lbfd 指定针对 libbfd 的链接。

标签: gcc symlink ld ldd


【解决方案1】:

不确定我是否正确理解了您(4 岁的问题),但与 libbfd 有类似问题,我找到了这个解决方案:

使用链接器标志-lbfd 似乎有效。

它是一个链接器标志,指定 g++ 链接到 libbfd。

我的完整命令是g++ loader.cc -lbfd

至少对我来说,链接时的错误(例如“未知函数”)得到了解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多