developer tip

iOS의 Delphi XE6 링크 C 코드

optionbox 2020. 11. 9. 08:02
반응형

iOS의 Delphi XE6 링크 C 코드


C 코드가 필요한 Delphi XE6을 사용하여 Android에서 앱을 빌드했습니다. 그러나 iOS에서는 작동하지 않습니다. 문제가 팔 / 엄지 상태와 관련된 것 같지만 확실하지 않습니다. 두 시스템 모두 Pascal에서 C 코드를 호출하는 데 문제가 없습니다. 그러나 C 코드가 Pascal 절차를 다시 호출하면 iOS가"bad system call (12)"

파스칼 코드는 다음과 같습니다.

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;

다음은 C 코드입니다.

extern int BackToPascal(int a,int b);

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

안드로이드에서 이것은 내가 컴파일하는 방법입니다 (작동 중입니다).

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

iOS에서 :

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

내 xcode 설정이 잘못되었다고 생각하지만 이유를 알 수 없습니다.

내가 디버깅 할 때 호출 할 때, 오류가 온다 testC에서 testarm호출 할 때 BackToPascal(에 "BL 0x8b8390 Xgobj.BackToPascal (INT, INT)"). Android에서는 완벽하게 작동하지만 bl직접 호출하지 않지만 BackToPascal다음 코드는 다음과 같습니다.

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

들어가는 BackToPascal


코드는 적절 해 보이며 호출 규칙 처리는 내 눈에 완벽하게 정확합니다.

정적 함수에서 정적 함수 (예 : 유형 변환을 위해 장면 뒤에서 발생할 수 있음)를 호출하면 스택 손상이 발생할 수있는 Apple의 ARM clang에서 가능한 / 소문이 난 버그가 발생했을 수 있습니다. 직접 그렇게하는 것은 아니지만 extern 함수는 구현을 포함하는 익명의 정적 함수를 호출하는 스텁을 통해 구현 될 수 있습니다.

extern 함수를 비 정적 구현 함수 만 호출하는 래퍼로 만들 수 있습니다.

참고 URL : https://stackoverflow.com/questions/25468888/delphi-xe6-link-c-code-in-ios

반응형