我如何强制 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。
触发此行为的条件是(至少)
STT_GNU_IFUNC
- 基本上具有具有此类属性的函数:__attribute__(ifunc(...))
- 不幸的是,这段代码必须去
- 必须禁用编译器标志
gnu-unique-object
(即您使用的编译器必须使用标志 --disable-gnu-unique-object
进行配置和构建)
通过执行上述操作,链接器应该在生成executable时使用SYSV哈希样式table s.
奖励:如果您随后想编译代码以在较旧的 Linux 发行版上运行,您可能需要在编译阶段 these headers 强制包含。您还希望使用这样的 headers 构建您的自定义 libstdc++
,然后将其与您的二进制文件一起发送。
我正在尝试在相对现代的 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。 触发此行为的条件是(至少)
STT_GNU_IFUNC
- 基本上具有具有此类属性的函数:__attribute__(ifunc(...))
- 不幸的是,这段代码必须去- 必须禁用编译器标志
gnu-unique-object
(即您使用的编译器必须使用标志--disable-gnu-unique-object
进行配置和构建)
通过执行上述操作,链接器应该在生成executable时使用SYSV哈希样式table s.
奖励:如果您随后想编译代码以在较旧的 Linux 发行版上运行,您可能需要在编译阶段 these headers 强制包含。您还希望使用这样的 headers 构建您的自定义 libstdc++
,然后将其与您的二进制文件一起发送。