Delphi XE6-Link-C-Code in iOS

Lesezeit: 3 Minuten

Benutzeravatar von Xavier Dufaure de Citres
Xavier Dufaure de Citres

Ich habe eine App auf Android mit Delphi XE6 erstellt, die C-Code erfordert. 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. Es gibt in beiden Systemen kein Problem, den C-Code von Pascal aus aufzurufen. Aber wenn der C-Code 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 debugge, kommt der Fehler beim Aufruf testC in testarm beim Anrufen BackToPascal ( auf “bl 0x8b8390 Xgobj.BackToPascal (int, int)” ). Auf Android funktioniert es hingegen einwandfrei bl ruft nicht direkt an BackToPascalaber der folgende Code:

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

Welche hineinkommen BackToPascal

  • Es wird in ähnlichen Threads darüber gesprochen, dass statische Funktionen ein Problem darstellen und das Entfernen von statischen Funktionen geholfen hat. Nicht genug Code, um in Ihrem Fall zu sehen, ob dies der Fall ist. hth

    – Koboldhack

    26. August 2014 um 13:24 Uhr

  • iOS ist 64-Bit, kompiliert die Pascal-Schnittstelle mit den Int-Werten zu Plattform-Ints? Ich hatte viele Probleme, als ich zu 64-Bit wechselte, da wir jede Menge Code mit Tonnen von “int” darin geerbt hatten. Wir mussten sie durch NSInteger ersetzen, damit die Anwendung unter 64-Bit ordnungsgemäß funktioniert.

    – thst

    29. März 2015 um 19:42 Uhr

  • Zum Zeitpunkt dieser Frage hatte Embarcadero veröffentlicht Delphi XE8. Hast du das neueste Delphi ausprobiert?

    – SwiftArchitect

    9. Juli 2015 um 5:09 Uhr

  • Ist es möglich, ein Problem der Anrufkonvention zu sein Verknüpfung (versuchen Sie Pascal zu “extern int BackToPascal(int a,int b);” hinzuzufügen)?

    – Shane Lu

    31. Juli 2015 um 7:35 Uhr

Der Code sieht ordentlich aus und die Handhabung Ihrer Aufrufkonvention ist in meinen Augen 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 z. B. zur Typkonvertierung hinter den Kulissen auftreten kann) 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.

1415670cookie-checkDelphi XE6-Link-C-Code in iOS

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy