Питон на руке, незаконные инструкции [закрыто]


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

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

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

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

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

Я искал код python, который отчеты backtrace вызывают ошибку (longobject.c строка 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++, которая добавляла/вычитала / делила e.t.c много двойников, как в коде выше, и она отлично работала на устройстве.


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

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

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

2 5

2 ответа:

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

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

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

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

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