Есть ли способ связать объекты, скомпилированные с GCC, без отключения инструкций SSE, статически с программой Delphi (Windows x86_64)?
Компилятор Embarcadero Delphi поддерживает формат объектов COFF, по крайней мере, начиная с Delphi XE2. Однако существует серьезное ограничение: если инструкции SSE не отключены с помощью gcc -mno-sse2, есть хороший шанс получить нарушения доступа. В частности, gcc помещает константы в раздел .rdata, который игнорируется Delphi. (Протестировано с XE5, XE7, 10.1, 10.2, 10.3)
С GCC 8.2 все стало еще сложнее: до сих пор было достаточно отключить SSE2.
Следующий код, скомпилированный с gcc 8.2.1, приводит к инструкциям SSE, даже если -mno-sse2 задан как опция:
unsigned *pIndexTable;
...
// Initialize index values
for (int i = 0; i < count; i++) {
*pIndexTable = i;
pIndexTable++;
}
Выход Objdump:
*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
Если SSE полностью отключен с -mno-sse, все становится еще хуже: SSE является частью ABI x86_64.