2012-03-12 2 views
5

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는 아무 것도보고하지 않습니다. 텍스트의 벽에 죄송

, 덕분에 당신이 여기까지 읽으면 : 당신이 장치의보다 높은 아키텍처 컴파일 일부 라이브러리에 연결하는 것 소리

답변

3

해결책을 찾았습니다!

make 통화 중에 콘솔에 쏟아진 모든 파일을 덤프했습니다. gcc에 대한 몇 가지 호출에 -march=armv4t 옵션이 포함되지 않은 것으로 나타났습니다.

나는 SBOX_EXTRA_COMPILER_FLAGS의 철자를 알아 냈습니다.SBOX_EXTRA_COMPILER_ARGS이어야합니다. 그 세트와 함께 CFLAGS-march=armv4t으로 설정되었습니다. 이제 Python은 불법적 인 지시없이 성공적으로 빌드되고 실행됩니다.

감사합니다. 레오, 나를 올바른 방향으로 가리켜주었습니다!

2

. ARMv4 CPU가있는 장치에 대해 CodeSourcery로 컴파일 할 때도 동일한 문제가있었습니다. AppSiftware 라이브러리는 ARMv5 용으로 컴파일되었습니다. 그것은 당신이 말한 것과 같은 부동 소수점 라이브러리 일 수도 있고 다른 라이브러리 일 수도 있습니다. 해당 파일이 컴파일되는 빌드 스크립트에서 해당 라이브러리의 위치를 ​​찾고 사용 된 라이브러리를 정확히 확인할 수 있습니까?

+0

좋아요! 이것은 올바른 방향입니다! 필자는 gnu 디버거에서 정확히 어떻게 불법적 인 지시가 있었는지 확인하기 위해 디스 어셈블리를 수행했습니다. aeabi_ * 함수에서 실행되는 CLZ 명령이라는 것이 밝혀졌습니다. ARM 문서에 따르면 CLZ 명령어는 ARM5 이상의 명령어입니다. 그 오류를 설명합니다. 이제 내가해야 할 일은이 명령어가 생성 된 곳을 추적하는 것인데, 이것은 좀 더 복잡합니다. 링크 된 라이브러리 중이 명령어가 포함되어 있지 않은지 확인했습니다. – Daniel

관련 문제