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
'developer tip' 카테고리의 다른 글
Eclipse 용 PHP Mess Detector (0) | 2020.11.09 |
---|---|
전처리 또는 후 처리 roxygen 스 니펫 (0) | 2020.11.09 |
.NET 또는 JavaScript에서 MS-XCEP 및 MS-WSTEP을 사용하여 AD CS에서 인증서를 받으려면 어떻게해야합니까? (0) | 2020.11.09 |
SandCastle에서 만든 두 페이지를 하나의 메인 페이지로 병합 할 수 있습니까? (0) | 2020.11.09 |
“이 UIView는 아무것도 모르는 NSISVariable의 대리자 인 것 같습니다. (0) | 2020.11.09 |