ios - que - soporte iphone



Código de enlace Delphi XE6 C en iOS (1)

El código parece correcto y su manejo de convención de llamadas es, a mis ojos, perfectamente correcto.

Creo que es posible que hayas topado con un error posible / rumorado en el sonido ARM de Apple, donde llamar a una función estática (que puede suceder detrás de las escenas, por ejemplo, para la conversión de tipo) de una función estática puede causar daños en la pila. No lo está haciendo directamente, pero las funciones externas pueden implementarse a través de un stub que llama a una función estática anónima que contiene la implementación.

Puede intentar que su función externa sea un contenedor que solo llame a una función de implementación no estática.

Creé una aplicación en Android usando Delphi XE6 que requiere código C. Sin embargo, en iOS no puedo hacer que funcione. Sospecho que el problema está relacionado con el estado del brazo / pulgar, pero no estoy seguro. No hay ningún problema en ninguno de los sistemas para llamar al código C de Pascal. Pero si el código C vuelve a llamar a un procedimiento Pascal, iOS genera una "bad system call (12)"

Aquí está el código 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;

Y aquí está el código C:

extern int BackToPascal(int a,int b);

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

En Android, así es como estoy compilando (está funcionando):

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

En ios:

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

Sospecho que mi configuración de xcode es incorrecta, pero no puedo entender por qué.

Cuando depuro, el error se produce al llamar a testC en testarm cuando se llama a BackToPascal (en "bl 0x8b8390 Xgobj.BackToPascal (int, int)"). En Android funciona perfecto, sin embargo, el bl no llama directamente a BackToPascal , pero el siguiente código:

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

Que entran en BackToPascal





delphi-xe6