Python on Arm, незаконные инструкции

Я пытаюсь скомпилировать Python 3.2 для ARM920T (архитектура 4T), но получаю некоторые странные ошибки.

Я компилирую Python в среде Scratchbox, настроенной на использование следующего компилятора: "gcc версии 4.3.3 (Sourcery G++ Lite 2009q1-203)", который является кросс-компилятором.

При компиляции я установил флаг архитектуры -march=armv4t в следующих переменных среды: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.

Он прекрасно компилируется в scratchbox, и я могу запустить интерпретатор python с эмулятором arm scratchbox.

Однако, когда я перемещаю его в свой ARM920T, я сразу же получаю ошибку Illegal Instruction после запуска 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 - это вызов библиотеки для добавления двух чисел с плавающей запятой (двойное добавление).

Я посмотрел код Python, который выдает ошибка в сообщениях backtrace (longobject.c line 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;
            }

Я действительно не понимаю, почему этот код должен вызывать какие-либо ошибки. Я попытался сделать небольшую программу на C++, которая добавляла / вычитала / делила и т.д. много двойников, как в коде выше, и она отлично работала на устройстве.


Любая помощь приветствуется. Единственное, о чем я могу думать, это то, что, возможно, неправильная библиотека с плавающей точкой компилируется в исполняемый файл. Насколько я могу судить из Google, ARM920T не имеет аппаратной поддержки с плавающей запятой.

Другой причиной могут быть ошибки выравнивания. При компиляции Python с флагом -Wcast-align он сообщает о нескольких предупреждениях. ARM не нравится, когда определенные типы данных не выровнены даже по адресам в памяти. Однако / proc / cpu / alignment ничего не сообщает.

Извините за стену текста, спасибо, если вы прочитали это далеко:)

2 ответа

Решение

Я нашел решение!

Я сделал файл-дамп всего, что вывалилось на консоль во время make позвонил, и я заметил, что несколько звонков gcc не содержал -march=armv4t вариант.

Я заметил, что я записал SBOX_EXTRA_COMPILER_FLAGS неправильно. Так должно быть SBOX_EXTRA_COMPILER_ARGS, С этим набором и CFLAGS установлен в -march=armv4t Python теперь успешно собирается и работает без недопустимых инструкций.

Спасибо Лео, что указал мне правильное направление!

Похоже, вы ссылаетесь на какую-то библиотеку, скомпилированную для более высокой архитектуры, чем на устройстве. У нас была такая же проблема при компиляции с CodeSourcery для устройства с процессором ARMv4. Очевидно, библиотеки CodeSourcery были скомпилированы для ARMv5. Это может быть библиотека с плавающей точкой, как вы сказали, или другая библиотека. Можете ли вы найти место в build-скрипте, где компилируется рассматриваемый файл, и точно проверить, какие библиотеки используются?

Другие вопросы по тегам