【问题标题】:Linux equivalent of Windows DLL forwarders or MacOS reexport_libraryLinux 等效于 Windows DLL 转发器或 MacOS reexport_library
【发布时间】:2014-03-31 14:47:36
【问题描述】:

我有一个共享库,它试图提供一个标准化的接口,基本上是一个函数列表。其中一些功能已经由另一个共享库提供。所以我可以只编写附加函数并要求用户链接到这两个库,即让他这样做:

g++ foo.c -lmine -lother

但是,为了让用户更轻松,我不想这样做。 (考虑到我所处的情况,这比在某些脚本中添加标志要复杂得多。)我希望用户只链接我的库并从另一个库中获取函数。

在 Windows 中,我可以使用 DLL 转发器并简单地列出我想要重新导出的函数。在 MacOS 中,我可以使用 --reexport_library 链接器选项让我的库假装包含另一个库。如果我不介意创建另一个库的完整副本并拥有静态版本,我可以使用上面的 --whole-archive 将其批量拉入我的库中。

但是在 Linux 中有什么方法可以给我的库的导出表一个条目,上面写着“这个函数在那边的另一个库中”?

或者,我可以对我的库做些什么,这样当它被提供给链接器时,链接器会说,“哦,我也需要拉入另一个库”? --rpath-link 选项的文档表明这应该可以工作,但事实并非如此。 libtool 当然会这样做,但 libtool 不是一个选项。

我当然可以做的只是用这些函数的小存根填充我的库,但我宁愿不这样做。必须以正确的顺序重命名以便链接器在正确的时间选择正确的版本,这将是非常烦人的。但如果真的没有其他办法,也将不胜感激。

【问题讨论】:

  • Er.. 如果 .so-lsomething 链接,它将拉取这个库。它是一种广泛使用的方法,例如libpng拉libz等。我不明白这个问题。
  • 用户代码可能直接引用来自something 的符号,如果-lsomething 不在命令行上,链接器将不会接受这一点。
  • 有没有办法在 Windows 上重新导出库中的所有符号,而不必包装每个符号?
  • @Andrew 我不知道,但你为什么不把这个当作一个真正的问题来问?
  • 我引用了这个问题和您相关的 clang 开发者邮件here

标签: linux linker shared-libraries


【解决方案1】:

StackOverflow 之外的某个人为我的问题提供了解决方案。

.so 文件不需要是实际的 ELF 文件。它也可以是链接描述文件。链接器脚本是包含链接器指令的文本文件。就我而言,脚本非常简单。我只是将此文本文件安装为libmine.so:

INPUT ( /install/prefix/lib/libmine.so.1 -lother )

这指示链接器在命令行中出现libmine.so(或-lmine)的位置查找我的库(带有版本后缀,因此它会选择实际的ELF文件),然后在库路径中搜索 other 库。

然后,我只需将 /install/prefix 替换为构建脚本中实际配置的安装前缀即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2012-08-29
    • 2019-07-30
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多