iOS에서의 Dellphi XE6 링크 C 코드
Delphi XE6를 사용하여 Android 상에서 C코드를 필요로 하는 앱을 만들었습니다.그러나 iOS에서는 동작하지 않습니다.암/엄지 상태에 문제가 있는 것 같습니다만, 잘 모르겠습니다.Pascal에서 C코드를 호출하는 것은 어느 시스템에서도 문제가 없습니다.그러나 C코드가 Pascal 프로시저를 호출하면 iOS가 생성하는 Pascal 프로시저는"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;
}
Android 에서는, 다음과 같이 컴파일 하고 있습니다(동작하고 있습니다).
..."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).Back To Pascal (int, int)" 。안드로이드에서는 완벽하게 동작하지만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에서 스태틱 함수(타입 변환 등 백그라운드에서 발생하는)를 호출하면 스택 파손이 발생할 수 있는 잠재적인/소문 버그가 발생했을 가능성이 있다고 생각합니다.직접 실행하는 것은 아니지만 외부 함수는 구현을 포함하는 익명 정적 함수를 호출하는 stub을 통해 구현될 수 있습니다.
외부 함수를 대신 비정적 구현 함수만 호출하는 래퍼로 할 수 있습니다.
언급URL : https://stackoverflow.com/questions/25468888/delphi-xe6-link-c-code-in-ios
'source' 카테고리의 다른 글
PHP DateTime 마이크로초는 항상 0을 반환합니다. (0) | 2022.10.20 |
---|---|
Python에서 목록의 키와 빈 값을 사용하여 dict를 초기화하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
if-else 속기 사용 시 두 번째 표현 생략 (0) | 2022.10.20 |
Java Long 프리미티브 유형 최대 제한 (0) | 2022.10.20 |
MySQL에서 열의 데이터 유형을 변경하려면 어떻게 해야 합니까? (0) | 2022.10.20 |