Delphi XE6在iOS中链接C代码
我已经使用需要C代码的Delphi XE6在Android上构build了一个应用程序。 但是在iOS上我无法使它工作。 我怀疑这个问题与arm/拇指状态有关,但我不确定。 从任何一个系统调用Pascal的C代码都没有问题。 但是,如果C代码callback一个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;
这里是C代码:
extern int BackToPascal(int a,int b); extern int testarm(int a,int b) { int i; i = BackToPascal(a,b); return i+1; }
在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
在ios上:
xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp
我怀疑我的Xcode设置是错误的,但我不明白为什么。
当我debugging时,调用BackToPascal
(在“BL 0x8B8390 Xgobj.BackToPascal(int,int)”)调用testC
在testarm
时出现错误。 在Android上它完美的工作,但bl
不直接调用BackToPascal
,但下面的代码:
75A82D94 12C68FE2 add r12, pc, #18874368 ; 0x1200000 75A82D98 73CA8CE2 add r12, r12, #471040 ; 0x73000 75A82D9C 40F2BCE5 ldr pc, [r12, #576]! ; 0x240
进入BackToPascal
代码看起来是正确的,你的调用约定处理,对我来说,是完全正确的。
我想你可能已经遇到了苹果公司ARM叮当中一个可能的/传闻中的bug,在静态函数中调用静态函数(这可能发生在幕后,例如types转换)可能会导致堆栈损坏。 你不是直接这样做,但是可以通过一个存根来实现外部函数,这个存根调用一个包含实现的匿名静态函数。
你可以尝试让你的extern函数是一个只调用非静态实现函数的包装器。