Delphi XE6 Link C-Code in iOS

68

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 testCin testarmbeim Aufruf BackToPascal(auf "bl 0x8b8390 Xgobj.BackToPascal (int, int)"). Unter Android funktioniert es einwandfrei, blruft 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

Xavier Dufaure de Citres
quelle
Es wird darüber gesprochen, dass ähnliche Threads statischer Funktionen ein Problem darstellen und das Herausnehmen statischer Funktionen hilfreich ist. Nicht genug Code, um in Ihrem Fall zu sehen, ob dies der Fall ist. hth
Neil McGill
iOS ist 64bit. Kompiliert die Pascal-Schnittstelle mit den int-Werten zu Plattform-Ints? Ich hatte viele Probleme, als ich auf 64-Bit umstieg, da wir eine Menge Code mit Tonnen von "int" geerbt hatten. Wir mussten sie durch NSInteger ersetzen, damit die Anwendung auf 64-Bit ordnungsgemäß funktioniert.
29.
Zum Zeitpunkt dieser Frage hatte Embarcadero Delphi XE8 veröffentlicht . Haben Sie das neueste Delphi ausprobiert?
SwiftArchitect
Ist es möglich , ein Problem der Aufrufkonvention sein Verbindung (versuchen Sie , pascal auf "extern int BackToPascal (int a, int b);")?
Shane Lu

Antworten:

1

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.

Siana
quelle