【问题标题】:Can a library detect/prevent linking in case of detected missmatched ABI?如果检测到不匹配的 ABI,库可以检测/防止链接吗?
【发布时间】:2022-01-13 06:58:46
【问题描述】:

动机: 一些图书馆,例如EigenABI that depends on compiler switches

问题: 这个库的用户能否以某种方式对这种行为进行编码,以便如果您尝试链接使用不同编译器开关编译的组件,则会出现链接器错误。

所以如果不清楚我为什么要问:

库开发人员 Alice 构建她的(不是仅标头库)没有特殊的编译器标志,并在她的 API 中公开 Eigen。

库使用者 Bob 在启用 AVX2 的情况下进行编译,他还在他的代码中使用 Eigen。他使用 Alice 库。

Bob 在运行时崩溃。

Alice 可以阻止她的库链接到 Bob 的应用程序吗?假设 Alice 知道使用影响 Eigen ABI 的预处理器宏来检测 ABI 不匹配。

注意:如果在编译器中实现,我可以使用 C++20 或 C++23 解决方案。

【问题讨论】:

  • Bob 在这里负责确保他的可执行文件与他正在使用的库的二进制兼容性。虽然 Alice 可以在库初始化时放置一些接口检查代码,但它不能 100% 防错。
  • 如果alice.lib 有一个初始化函数,我可以想象通过使用基于宏的模板定义和特化来强制链接错误。
  • 不,我没有。但它与@user7860670 显示的问题中的建议基本相似。两者的想法是相同的,如果宏更改,则强制链接失败,因为声明丢失或不匹配。
  • 如果用户对库什么都不做,则不存在 ABI 问题:P 并且链接错误也只发生在那些使用的部分。因此,如果您没有保证进入库的入口点,则需要将该 hack 包含到用户使用的所有内容中。然而,这也可以使用一个静态变量来完成,该变量保证会被初始化以执行此检查。

标签: c++ c++20 abi


【解决方案1】:

对于 avx2,至少看起来您可以知道编译器是否正在为其编译 via built in defines。但这可能无济于事,因为听起来您只是获得了 Alice 库的二进制文件。

理想情况下,我认为 Bob 自己编译 Alices 库,然后链接到它以保证兼容 abi。除了这个选项,我可以想到一种不太理想的检查方式,objdump 库和 grep 以查看反汇编中的 avx2 指令是否正在使用。

【讨论】:

    【解决方案2】:

    C++ 对编译器开关/选项一无所知。它们是特定于编译器的,并且没有正式指定(通常)。所以没有办法以可移植和通用的方式对其进行编码。你只是不知道你需要编码什么。 如果您将范围限制为特定平台/编译器/工具集/选项,则有一些选项。但是,同样,它超出了 C++ 的范围,更多的是关于工具。例如 gcc/clang 允许记录命令行选项(-grecord-gcc-switches)。通过强制图书馆供应商使用它并在预链接步骤中检查记录,您可能会实现您想要的。理论上至少......

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 2015-08-20
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2022-06-22
      相关资源
      最近更新 更多