2012-03-12 25 views
5

Tôi đang cố gắng biên dịch Python 3.2 cho ARM920T (kiến trúc 4T) nhưng tôi gặp phải một số lỗi lạ.Python trên cánh tay, Hướng dẫn bất hợp pháp

Tôi đang biên dịch Python bên trong môi trường Scratchbox, được định cấu hình để sử dụng trình biên dịch sau: "gcc phiên bản 4.3.3 (Sourcery G ++ Lite 2009q1-203)" là trình biên dịch chéo cánh tay.

Khi biên dịch tôi đã đảm bảo đặt cờ kiến ​​trúc -march = armv4t, trong các biến môi trường sau: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.

Nó biên soạn tốt trong hộp cào, và tôi có thể chạy trình thông dịch python với trình giả lập tay hộp cào.

Khi tôi chuyển nó sang ARM920T của mình, tuy nhiên, tôi gặp lỗi Instruction bất hợp pháp một cách bất thường sau khi chạy exe python.

Một bãi chứa lõi yeilds đầu ra sau đây:

Program terminated with signal 4, Illegal instruction. 
#0 0x00138810 in __aeabi_dadd() 

Và vài dòng đầu tiên của back-trace:

#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 

Theo như tôi đã có thể nghiên cứu, các cuộc gọi __aeabi_dadd là một cuộc gọi thư viện để thêm hai số dấu chấm động (Double Add).

Tôi nhìn lên mã python mà báo cáo vết lùi gây ra lỗi (longobject.c dòng 2001):

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; 
      } 

Tôi thực sự không hiểu tại sao mã này nên gây ra bất kỳ lỗi nào. Tôi đã thử thực hiện một chương trình C++ nhỏ mà thêm/trừ/chia e.t.c rất nhiều gấp đôi, như trong đoạn mã trên, và nó chạy tốt trên thiết bị.


Mọi trợ giúp sẽ được đánh giá cao. Điều duy nhất tôi có thể nghĩ đến là có lẽ thư viện dấu chấm động sai đang được biên dịch vào exe. ARM920T không có hỗ trợ điểm nổi phần cứng theo như tôi có thể nói từ Google.

Một nguyên nhân khác có thể là lỗi căn chỉnh. Khi biên dịch Python với cờ -Wcast-align, nó báo cáo một vài cảnh báo đúc. ARM không thích nó khi các kiểu dữ liệu nhất định không được căn chỉnh ngay cả trong các địa chỉ trong bộ nhớ./proc/cpu/alignment không báo cáo bất cứ điều gì tuy nhiên.

Xin lỗi vì các bức tường của văn bản, nhờ nếu bạn đọc đến đây :)

Trả lời

3

Tôi đã tìm ra giải pháp!

Tôi đã tạo một tệp kết xuất tất cả mọi thứ được giải phóng trên bảng điều khiển trong cuộc gọi make và tôi nhận thấy rằng một vài cuộc gọi đến gcc không chứa tùy chọn -march=armv4t.

Tôi nhận thấy rằng tôi đã viết sai số SBOX_EXTRA_COMPILER_FLAGS.Nó phải là SBOX_EXTRA_COMPILER_ARGS. Với tập hợp đó và CFLAGS được đặt thành -march=armv4t Giờ đây, Python đã tạo và chạy thành công mà không có hướng dẫn bất hợp pháp.

Cảm ơn Leo, vì đã chỉ cho tôi đúng hướng!

2

Có vẻ như bạn đang liên kết với một số thư viện được biên soạn cho một kiến ​​trúc cao hơn so với cái trên thiết bị. Chúng tôi đã có cùng một vấn đề khi biên dịch với CodeSourcery cho một thiết bị với CPU ARMv4. Các thư viện CodeSourcery được biên dịch cho ARMv5. Nó có thể là thư viện dấu chấm động như bạn đã nói, hoặc nó có thể là một thư viện khác. Bạn có thể tìm thấy vị trí trong kịch bản lệnh xây dựng nơi tệp được đề cập đang được biên soạn và kiểm tra chính xác thư viện nào được sử dụng không?

+0

Tuyệt vời! Điều này đang đi đúng hướng! Tôi quản lý để làm một disassembly trong trình gỡ lỗi gnu, để xem những gì chính xác các hướng dẫn bất hợp pháp được. Nó chỉ ra rằng nó là một lệnh CLZ, được thực thi trong các hàm aeabi_ *. Theo các tài liệu ARM, lệnh CLZ là một lệnh ARM5 và ở trên. Điều đó giải thích lỗi. Bây giờ tất cả những gì tôi cần làm là theo dõi hướng dẫn này được tạo ra ở đâu, điều này phức tạp hơn một chút. Tôi đã kiểm tra rằng không có thư viện nào được liên kết chứa lệnh này. – Daniel

Các vấn đề liên quan