gcc 如何在编译带有-static选项的程序时禁止avx 512?

8dtrkrch  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(124)

我有一个程序,可以在本地机器上编译,需要在远程服务器上运行,它不允许在远程服务器上编译。
现在这些本地机器的cpu都设置了AVX 512仪器,但是远程服务器没有。一般来说,我们可以使用-march=x86-86, -march=core-avx2, -mo-avx512f等来尝试禁用avx 512仪器,但是有一个问题是,本地机器的glibc版本比远程机器的高,所以我需要静态编译程序。如果没有,程序将转储在远程服务器上,因为glibc的版本不低(遗憾的是,不允许在远程服务器上更新glibc),但是当我用-static编译时,我会发现程序有AVX 512仪器。(我找到AVX 512的方法是使用一个名为elfx 86 exts的工具来检查程序有什么仪器)。
有没有一些方法来编译一个程序,可以在远程服务器上运行?
很抱歉,我的英语不是很好,如果有什么地方我没有表达清楚,请问我。谢谢大家。
我尝试了一些编译选项组合。
1.-static -march=x86-64。
1.+ -mno-avx 512 f-mno-avx 512 dq-mno-avx 512 idma和其他-mno-avx 512选项。
1.-static-libgcc -static-libstdc++ -march=x86-64
1.- 三月=x86-64. -mno-avx 512

1、2、3将在avx 512测试的ci处失败,4没有avx 512,但会有glibc版本的冲突。

kb5ga3dv

kb5ga3dv1#

但有一个问题是,glibc在本地机器的版本比远程高,所以我需要静态编译程序。
这个问题的解决方案是 * 不 * 静态链接;它是针对libc的目标版本的 * 适当 * 链接(例如,通过在Docker容器内构建,或通过将编译器指向备用libc安装)。
与流行的看法相反,静态链接的二进制文件在移动到不同的机器时几乎永远不会(正确)工作。

相关问题