Delphi XE6 lien C code dans iOS

J’ai construit une application sur Android en utilisant Delphi XE6 qui nécessite du code C. Cependant, sur iOS, je ne peux pas le faire fonctionner. Je soupçonne que le problème est lié au statut arm / pouce, mais je ne suis pas sûr. Il n’y a pas de problème dans les deux systèmes pour appeler le code C de Pascal. Mais si le code C rappelle une procédure Pascal, iOS génère un "bad system call (12)"

Voici le code 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; 

Et voici le code C:

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

Sur Android, c’est comme ça que je comstack (ça marche):

 ..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8 

Sur ios:

 xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp 

Je soupçonne que mes parameters xcode sont incorrects mais je ne peux pas comprendre pourquoi.

Lorsque je débogue, l’erreur survient lors de l’appel de testC en testarm lors de l’appel de BackToPascal (sur “bl 0x8b8390 Xgobj.BackToPascal (int, int)”). Sur Android, cela fonctionne parfaitement mais le bl n’appelle pas directement BackToPascal , mais le code suivant:

 75A82D94 12C68FE2 add r12, pc, #18874368 ; 0x1200000 75A82D98 73CA8CE2 add r12, r12, #471040 ; 0x73000 75A82D9C 40F2BCE5 ldr pc, [r12, #576]! ; 0x240 

Qui entrent dans BackToPascal

Le code semble correct et le traitement de votre convention d’appel est, à mes yeux, parfaitement correct.

Je pense que vous avez peut-être rencontré un bogue possible / présumé dans le clone d’ARM d’Apple, où l’appel d’une fonction statique (qui peut se produire en coulisse, par exemple pour la conversion de type) à partir d’une fonction statique peut entraîner une corruption de stack. Vous ne le faites pas directement, mais les fonctions externes peuvent être implémentées via un stub qui appelle une fonction statique anonyme contenant l’implémentation.

Vous pouvez essayer d’avoir votre fonction externe comme un wrapper qui appelle uniquement une fonction d’implémentation non statique.