将用gcc编译的包含SSE指令的对象链接到Delphi程序

时间:2019-01-17 15:30:38

标签: delphi gcc sse

是否有一种方法可以在不禁用SSE指令的情况下将通过GCC编译的对象静态链接到Delphi程序(Windows x86_64)?

至少从Delphi XE2开始,Embarcadero的Delphi编译器就支持COFF对象格式。但是,似乎存在一个严重的局限性:如果未使用gcc的-mno-sse2禁用SSE指令,则很有可能会出现访问冲突。更具体地说,gcc将常量放置在Delphi忽略的.rdata节中。 (已通过XE5,XE7、10.1、10.2、10.3测试)

使用GCC 8.2,事情变得更加困难:到现在为止,禁用SSE2就足够了。

即使使用-mno-sse2作为选项,使用gcc 8.2.1编译时,以下代码也会产生SSE指令:

unsigned *pIndexTable;
...
// Initialize index values
for (int i = 0; i < count; i++) {
    *pIndexTable = i;
    pIndexTable++;
}

对象转储输出:

    *pIndexTable = i;
a56: 0f 28 05 00 00 00 00       movaps xmm0,XMMWORD PTR [rip+0x0]   # a5d <GenerateTable+0x79d> a59: R_X86_64_PC32 .rdata
a5d: c1 e8 02                   shr    eax,0x2
a60: 0f 11 04 9d 00 00 00 00    movups XMMWORD PTR [rbx*4+0x0],xmm0

如果使用-mno-sse完全禁用了SSE,则情况会更糟:SSE是x86_64 ABI的一部分。

0 个答案:

没有答案