ARM920T (아키텍처 4T) 용으로 파이썬 3.2를 컴파일하려고하는데 이상한 오류가 발생했습니다.팔상의 파이썬, 불법적 인 지시
저는 팔 크로스 컴파일러 인 "gcc version 4.3.3 (Sourcery G ++ Lite 2009q1-203)"컴파일러를 사용하도록 구성된 Scratchbox 환경에서 파이썬을 컴파일 중입니다.
컴파일 할 때 다음 환경 변수에서 -march = armv4t 구조 플래그를 설정해야합니다. CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.
스크래치 박스에서 잘 컴파일되며 스크래치 박스 에뮬레이터로 파이썬 인터프리터를 실행할 수 있습니다.
그러나 ARM920T로 옮길 때 python exe를 실행 한 후 불규칙한 명령어 오류가 발생합니다.
Program terminated with signal 4, Illegal instruction.
#0 0x00138810 in __aeabi_dadd()
그리고 백 트레이스의 처음 몇 줄 : 지금까지 내가 연구 할 수 있었다으로
#0 0x00138810 in __aeabi_dadd()
#1 0x001134f4 in PyLong_FromString (str=0x402de300 "3644798167", pend=0x0, base=10) at Objects/longobject.c:2001
#2 0x00132478 in parsenumber (s=<value optimized out>, c=<value optimized out>) at Python/ast.c:3189
#3 ast_for_atom (n=<value optimized out>, c=<value optimized out>) at Python/ast.c:1396
#4 ast_for_power (n=<value optimized out>, c=<value optimized out>) at Python/ast.c:1726
#5 ast_for_expr (c=0xbeaf7f50, n=0x402f5b78) at Python/ast.c:191
의 __aeabi_dadd 전화
코어 덤프는 다음과 같은 출력을 yeilds 두 개의 부동 소수점 수를 추가하는 라이브러리 호출입니다 (Double Add).
if (log_base_BASE[base] == 0.0) {
twodigits convmax = base;
int i = 1;
log_base_BASE[base] = (log((double)base)/ // Line 2001
log((double)PyLong_BASE));
for (;;) {
twodigits next = convmax * base;
if (next > PyLong_BASE)
break;
convmax = next;
++i;
}
이 코드는 오류의 원인이해야하는 이유를 정말보고 해달라고 :
나는 역 추적 보고서 오류 (longobject.c 라인 2001)의 원인이되는 파이썬 코드를 보았다. 위의 코드처럼 e.t.c를 더하거나 빼거나 작은 코드를 두는 작은 C++ 프로그램을 만들려고 시도했지만 장치에서 잘 돌아갔다.
어떤 도움을 주시면 감사하겠습니다. 내가 생각할 수있는 유일한 점은 아마도 잘못된 부동 소수점 라이브러리가 exe 파일로 컴파일되고 있다는 것입니다. ARM920T에는 Google에서 알 수있는 한 하드웨어 부동 소수점 지원 기능이 없습니다.
또 다른 원인은 정렬 오류 일 수 있습니다. -Wcast-align 플래그로 파이썬을 컴파일 할 때, 캐스팅 경고를 몇 가지보고합니다. ARM은 특정 데이터 유형이 메모리의 짝수 주소에 정렬되지 않은 경우이를 좋아하지 않습니다./proc/cpu/alignment는 아무 것도보고하지 않습니다. 텍스트의 벽에 죄송
, 덕분에 당신이 여기까지 읽으면 : 당신이 장치의보다 높은 아키텍처 컴파일 일부 라이브러리에 연결하는 것 소리
좋아요! 이것은 올바른 방향입니다! 필자는 gnu 디버거에서 정확히 어떻게 불법적 인 지시가 있었는지 확인하기 위해 디스 어셈블리를 수행했습니다. aeabi_ * 함수에서 실행되는 CLZ 명령이라는 것이 밝혀졌습니다. ARM 문서에 따르면 CLZ 명령어는 ARM5 이상의 명령어입니다. 그 오류를 설명합니다. 이제 내가해야 할 일은이 명령어가 생성 된 곳을 추적하는 것인데, 이것은 좀 더 복잡합니다. 링크 된 라이브러리 중이 명령어가 포함되어 있지 않은지 확인했습니다. – Daniel