首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS中的Delphi XE6链接C代码

iOS中的Delphi XE6链接C代码
EN

Stack Overflow用户
提问于 2014-08-24 13:47:51
回答 1查看 755关注 0票数 68

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

下面是pascal代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
extern int BackToPascal(int a,int b);

extern int testarm(int a,int b)
{
   int i;
   i = BackToPascal(a,b);
   return i+1;
}

在android上,我是这样编译的(它是有效的):

代码语言:javascript
复制
..."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上:

代码语言:javascript
复制
xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp

我怀疑我的xcode设置是错误的,但我找不出原因。

调试时,在testarm中调用testC时出现错误,同时调用BackToPascal ( on "bl 0x8b8390 Xgobj.BackToPascal (int,int )“)。在安卓上,它工作得很完美,但是bl不会直接调用BackToPascal,而是调用以下代码:

代码语言:javascript
复制
75A82D94 12C68FE2         add r12, pc, #18874368 ; 0x1200000
75A82D98 73CA8CE2         add r12, r12, #471040 ; 0x73000
75A82D9C 40F2BCE5         ldr pc, [r12, #576]! ; 0x240

哪些内容可以进入BackToPascal

EN

回答 1

Stack Overflow用户

发布于 2015-08-13 00:33:55

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

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

您可以尝试让您的外部函数成为一个包装器,它只调用非静态实现函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25468888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档