是否有一种方法可以在不禁用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的一部分。