在Solaris x86平台上的映射文件中覆盖hwcap_2

时间:2018-11-08 14:41:07

标签: x86 linker solaris solaris-studio suncc

我们有一个保护运行时路径的库。如果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}}和SSE2hwcap_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

1 个答案:

答案 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;