我们有一个保护运行时路径的库。如果cpu功能可用,则采用更快的代码路径。我们正在尝试在Solaris 11.3上添加AVX2代码路径。
在没有AVX2的旧的低端计算机上,我们遇到的是
$ ./cryptest.exe v
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_2) unsupported: 0x40 [ AVX2 ]
Killed
由于运行时功能检测,我们有一个清除功能的映射文件。对于CA_SUNW_HW_1
和AESNI,CLMUL,SSE4.2,SSE4.1和SSE3来说,效果很好:
$ cat cryptopp.mapfile
hwcap_1 = SSE SSE2 OVERRIDE;
我们需要清除hwcap_2
的上限。根据Sun的Mapfile Directives,我们应该能够使用空的分配清除上限:
如果使用“ =”运算符,则指定的值将替换先前的值,并将exclude重置为0。此外,使用“ =”将覆盖从输入文件处理中收集的所有功能。
然后在文档的后面:
要完全消除输出对象的给定功能,只需使用“ =”运算符和一个空值列表即可。
因此,我们添加了一个空的hwcap_2
以消除该功能:
$ cat cryptopp.mapfile
hwcap_1 = SSE SSE2 OVERRIDE;
hwcap_2 = ;
但是会导致相同的运行时错误。
我们在Disable hwcaps on libgfortran发现了一个错误报告,但是它具有Autools解决方法,而没有Mapfile修复程序。
如何在Solaris x86上的映射文件中清除AVX和AVX2功能?
设置hwcap_2 = 0;
会在链接时产生以下结果:
ld: fatal: cryptopp.mapfile: 4: unknown segment attribute: 0
make: *** [GNUmakefile:1084: cryptest.exe] Error 2
我们不能使用hwcap_2 = SSE SSE2
,因为SSE
的{{1}}和SSE2
与hwcap_1
的{{1}}和AV2_386_RDSEED
发生冲突
这是使用映射文件的完整链接命令:
AV2_386_ADX
链接器包含hwcap_2
选项(已由映射文件删除)的原因是,该手册告诉我们链接命令必须包含所有$ CXX=/opt/solarisstudio12.4/bin/CC make
/opt/solarisstudio12.4/bin/CC -o cryptest.exe -DNDEBUG -g -xO3 -template=no%extd
ef adhoc.o test.o bench1.o bench2.o bench3.o datatest.o dlltest.o fipsalgt.o val
idat0.o validat1.o validat2.o validat3.o validat4.o validat5.o validat6.o valida
t7.o validat8.o validat9.o validat10.o regtest1.o regtest2.o regtest3.o regtest4
.o ./libcryptopp.a -xarch=sse2 -xarch=ssse3 -xarch=sse4_1 -xarch=sse4_2 -xarch=a
es -xarch=avx -xarch=avx2 -M cryptopp.mapfile -lnsl -lsocket
$
选项。因此,我们别无选择。
这是-xarch
:
-xarch
答案 0 :(得分:2)
在我看来,您的地图文件不完整。从您的链接到Oracle Solaris 11.1 Linkers and Libraries Guide的示例如下:
要从输出对象中完全消除给定的功能,只需使用“ =”运算符和一个空值列表即可。例如,以下内容禁止输入对象贡献的任何硬件功能:
$mapfile_version 2 CAPABILITY { HW = ; };
但是您的地图文件是:
hwcap_1 = SSE SSE2 OVERRIDE;
hwcap_2 = ;
编辑:
此外,每次@jww检查解析链接器映射的the ld
source code时,未记录的值V0x0
会删除版本1映射文件的硬件功能:
hwcap_1 = SSE SSE2 OVERRIDE;
hwcap_2 = V0x0;