Ich habe eine App auf Android mit Delphi XE6 erstellt, für die C-Code erforderlich ist. Unter iOS kann ich es jedoch nicht zum Laufen bringen. Ich vermute, dass das Problem mit dem Arm- / Daumenstatus zusammenhängt, bin mir aber nicht sicher. In beiden Systemen ist es kein Problem, den C-Code von Pascal aufzurufen. Wenn der C-Code jedoch eine Pascal-Prozedur zurückruft, generiert iOS eine"bad system call (12)"
Hier ist der Pascal-Code:
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;
Und hier ist der C-Code:
extern int BackToPascal(int a,int b);
extern int testarm(int a,int b)
{
int i;
i = BackToPascal(a,b);
return i+1;
}
Auf Android kompiliere ich so (es funktioniert):
..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8
Auf ios:
xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp
Ich vermute, dass meine Xcode-Einstellungen falsch sind, aber ich kann nicht herausfinden, warum.
Wenn ich debuggen, kommt der Fehler beim Aufruf testC
in testarm
beim Aufruf BackToPascal
(auf "bl 0x8b8390 Xgobj.BackToPascal (int, int)"). Unter Android funktioniert es einwandfrei, bl
ruft aber nicht direkt auf BackToPascal
, sondern den folgenden Code:
75A82D94 12C68FE2 add r12, pc, #18874368 ; 0x1200000
75A82D98 73CA8CE2 add r12, r12, #471040 ; 0x73000
75A82D9C 40F2BCE5 ldr pc, [r12, #576]! ; 0x240
Welche kommen rein BackToPascal
Antworten:
Der Code sieht korrekt aus und Ihre Behandlung von Anrufkonventionen ist meiner Meinung nach vollkommen korrekt.
Ich denke, Sie sind möglicherweise auf einen möglichen / gemunkelten Fehler in Apples ARM-Clang gestoßen, bei dem das Aufrufen einer statischen Funktion (die hinter den Kulissen auftreten kann, z. B. zur Typkonvertierung) von einer statischen Funktion zu einer Stapelbeschädigung führen kann. Sie tun dies nicht direkt, aber externe Funktionen können über einen Stub implementiert werden, der eine anonyme statische Funktion aufruft, die die Implementierung enthält.
Sie können versuchen, Ihre externe Funktion als Wrapper zu verwenden, der stattdessen nur eine nicht statische Implementierungsfunktion aufruft.
quelle