Delphi XE6在iOS中链接C代码

Xav*_*res 68 c delphi pascal ios delphi-xe6

我使用需要C代码的Delphi XE6在Android上构建了一个应用程序.但是在iOS上我无法使其工作.我怀疑这个问题与手臂/拇指状态有关,但我不确定.两个系统都没有问题从Pascal调用C代码.但是如果C代码回调一个Pascal过程,iOS会生成一个"bad system call (12)"

这是pascal代码:

function testarm(a,b:integer):integer; cdecl; external "testC.o";

Procedure testC;
Begin
  testarm(1,2);
end;

function BackToPascal(a,b:integer): integer; cdecl;
  Begin
  result := a+b;
end;

......

exports
  BackToPascal;
Run Code Online (Sandbox Code Playgroud)

这是C代码:

extern int BackToPascal(int a,int b);

extern int testarm(int a,int b)
{
   int i;
   i = BackToPascal(a,b);
   return i+1;
}
Run Code Online (Sandbox Code Playgroud)

在android上这是我编译的方式(它正在工作):

..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8
Run Code Online (Sandbox Code Playgroud)

在ios上:

xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp
Run Code Online (Sandbox Code Playgroud)

我怀疑我的xcode设置是错误的,但我无法弄清楚原因.

当我调试,错误时调用来testCtestarm调用时BackToPascal(在"BL 0x8b8390 Xgobj.BackToPascal(INT,INT)").在Android上它完美但bl不直接调用BackToPascal,但以下代码:

75A82D94 12C68FE2         add r12, pc, #18874368 ; 0x1200000
75A82D98 73CA8CE2         add r12, r12, #471040 ; 0x73000
75A82D9C 40F2BCE5         ldr pc, [r12, #576]! ; 0x240
Run Code Online (Sandbox Code Playgroud)

进入 BackToPascal

小智 1

代码看起来正确,并且在我看来,您的调用约定处理是完全正确的。

我认为您可能在 Apple 的 ARM clang 中遇到了一个可能的/传闻中的错误,其中从静态函数调用静态函数(可能在幕后发生,例如用于类型转换)可能会导致堆栈损坏。您不是直接这样做,但外部函数可以通过调用包含实现的匿名静态函数的存根来实现。

您可以尝试让您的 extern 函数成为仅调用非静态实现函数的包装器。