Код кода С++ Delphi XE6 в iOS

Я создал приложение на Android с помощью Delphi XE6, для которого требуется код C. Однако на iOS я не могу заставить его работать. Я подозреваю, что проблема связана с состоянием руки/пальца, но я не уверен. В любой системе нет проблем вызывать код C из Pascal. Но если код 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;
}

В андроиде это то, как я компилирую (он работает):

..."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 неверны, но я не могу понять, почему.

При отладке ошибка возникает при вызове testC в testarm при вызове 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

Ответ 1

Код выглядит правильно, и ваше обращение к конференц-вызовам, на мой взгляд, совершенно правильно.

Я думаю, что вы, возможно, столкнулись с возможной ошибкой/слухом в Apple ARM clang, где вызов статической функции (которая может произойти за кулисами, например, для преобразования типов) из статической функции может привести к повреждению стека. Вы не делаете этого напрямую, но внешние функции могут быть реализованы через заглушку, которая вызывает анонимную статическую функцию, содержащую реализацию.

Вы можете попробовать, чтобы ваша внешняя функция была оболочкой, которая вместо этого вызывает нестационарную реализацию.