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 :)
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