iOS中的Delphi XE6链接C代码


68

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

这是帕斯卡代码:

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设置错误,但是我不知道为什么。

当我调试,错误时调用来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

哪个进入 BackToPascal


有一些关于静态函数的类似线程问题的讨论,并寻求静态帮助。没有足够的代码来查看您的情况是否如此。hth
Neil McGill

iOS是64位的,带有int值的pascal接口可以编译为平台int吗?转到64位时,我遇到了很多问题,因为我们继承了内部带有大量“ int”的代码。我们必须用NSInteger替换它们,以使应用程序可以在64位上正常工作。
THST

截至发稿时,Embarcadero已发布了Delphi XE8。您尝试过最新的Delphi吗?
SwiftArchitect

调用约定链接是否有问题(尝试将pascal添加到“ extern int BackToPascal(int a,int b);”)?
Shane Lu

Answers:


1

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

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

您可以尝试将extern函数作为包装器,而仅调用非静态实现函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.