我如何强制 gcc/g++ 创建 SYSV 可执行文件而不是 GNU/Linux?

How can I force gcc/g++ to create SYSV exectables instead of GNU/Linux?

我正在尝试在相对现代的 Linux 发行版 (A) 上构建可执行文件(程序和 共享对象 ),并希望 运行 那些在相当旧的 (B) 上。 A 可以构建 SYSV 但有时它会退回到 GNU/Linux,当 运行ning 这样时会导致问题B 上的可执行文件(B 拒绝 运行)。

如何强制 gcc/g++(或链接器)只构建 SYSV 可执行文件? 如果不可能,后续问题将是什么 triggering/forcing gcc/g++ 采用 GNU/Linux 约定而不是 SYSV(在 this 问题上展开)? 我怎样才能防止这种联系发生?

谢谢

显然没有 正式 方法可以做到这一点(即使传递链接器标志 -Wl,--hash-style=sysv 也可能无法正常工作,具体取决于已编译的代码)。

链接器将尝试默认为 SYSV,但随后在必要时使用 GNU/Linux。 触发此行为的条件是(至少)

  1. STT_GNU_IFUNC - 基本上具有具有此类属性的函数:__attribute__(ifunc(...)) - 不幸的是,这段代码必须去
  2. 必须禁用编译器标志 gnu-unique-object(即您使用的编译器必须使用标志 --disable-gnu-unique-object 进行配置和构建)

通过执行上述操作,链接器应该在生成executable时使用SYSV哈希样式table s.


奖励:如果您随后想编译代码以在较旧的 Linux 发行版上运行,您可能需要在编译阶段 these headers 强制包含。您还希望使用这样的 headers 构建您的自定义 libstdc++,然后将其与您的二进制文件一起发送。