Я потратил несколько дней, пытаясь кросс-компилировать gcc 4.8.2, чтобы использовать сгенерированный компилятор для компиляции более старой версии strace для системы MIPS с обратным порядком байтов, и в основном я следовал это руководство: https://comparch-resources.ece.gatech.edu/resources/gcc-mips/gcc-from-source/
Все в этом руководстве работает вплоть до пересборки gcc с помощью newlib. После выполнения этой команды восстановления я получаю следующую ошибку:
checking for mips-linux-gnu-gcc... /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include
checking for suffix of object files... configure: error: in `/opt/cross/gcc-build/mips-linux-gnu/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make[1]: *** [configure-target-libgcc] Error 1
make[1]: Leaving directory `/opt/cross/gcc-build'
make: *** [all] Error 2
Вот частичная выдержка из /opt/cross/gcc-build/mips-linux-gnu/libgcc/config.log
:
Configured with: ../gcc-4.8.2/configure --target=mips-linux-gnu --prefix=/opt/cross/gcc-mips --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-multilib --with-newlib
Thread model: posix
gcc version 4.8.2 (GCC)
configure:3358: $? = 0
configure:3347: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -V >&5
xgcc: error: unrecognized command line option '-V'
xgcc: fatal error: no input files
compilation terminated.
configure:3358: $? = 1
configure:3347: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -qversion >&5
xgcc: error: unrecognized command line option '-qversion'
xgcc: fatal error: no input files
compilation terminated.
configure:3358: $? = 1
configure:3374: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -o conftest -g -O2 -Wno-error -minterlink-mips16 conftest.c >&5
/opt/cross/gcc-build/./gcc/as: 87: exec: -EB: not found
configure:3377: $? = 1
configure:3565: checking for suffix of object files
configure:3587: /opt/cross/gcc-build/./gcc/xgcc -B/opt/cross/gcc-build/./gcc/ -B/opt/cross/gcc-mips/mips-linux-gnu/bin/ -B/opt/cross/gcc-mips/mips-linux-gnu/lib/ -isystem /opt/cross/gcc-mips/mips-linux-gnu/include -isystem /opt/cross/gcc-mips/mips-linux-gnu/sys-include -c -g -O2 -Wno-error -minterlink-mips16 conftest.c >&5
/opt/cross/gcc-build/./gcc/as: 87: exec: -EB: not found
configure:3591: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU C Runtime Library"
| #define PACKAGE_TARNAME "libgcc"
| #define PACKAGE_VERSION "1.0"
| #define PACKAGE_STRING "GNU C Runtime Library 1.0"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL "http://www.gnu.org/software/libgcc/"
| /* end confdefs.h. */
|
| int
| main ()
| {
|
| ;
| return 0;
| }
configure:3605: error: in `/opt/cross/gcc-build/mips-linux-gnu/libgcc':
configure:3608: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
Открывая /opt/cross/gcc-build/gcc/as
, мы видим, что строка 87 — это exec $original ${1+"$@"}
, и поскольку exec
пытается выполнить -EB
, а не <correct compiler> -EB
, я думаю, что это означает, что <62816749> пусто (т.е. не установлено) при вызове exec. Однако я не уверен, какой компилятор $original
должен быть установлен для того, чтобы скрипт configure не дал сбой, и я пробовал различные варианты, такие как /opt/cross/gcc-build/./gcc/xgcc
, но все они терпели неудачу.
Хотя внешне этот пост кажется похожим на некоторые другие из более старых времен, я не думаю, что кто-то еще столкнулся с этим конкретным препятствием с проблемой exec. Таким образом, любая помощь будет принята с благодарностью!
Возможно, глупый вопрос, но пробовали ли вы передать «--build и --host», установленные для архитектуры вашей локальной машины, вместо того, чтобы устанавливать только «--target»?
На самом деле нет. Что я должен предоставить в эти поля? Я предполагаю, что --host должен быть похож на x86_64 или что-то в этом роде, но как насчет --build? Спасибо за быстрый ответ!
См. это. Но, как правило, хост и сборка должны быть одинаковыми, если вы не делаете «канадский», то есть компилятор сборки на X (сборка), который будет запускаться на Y (хост) и создает двоичный файл для Z (цель). Обычно host==build.
Что касается самой настройки: скорее всего это будет amd64-linux-gnu или x86_64-linux-gnu. Поскольку Ubuntu обычно основан на Debian, может быть применим триплет Debian.
Ссылку посмотрю, большое спасибо за ссылку. Надеюсь, это продвинет меня дальше в этом процессе, но, если повезет, кто знает, ха-ха; отчитаюсь завтра.
Хм, теперь, когда я делаю
../gcc-4.8.2/configure --target=mips-linux-gnu --prefix=$PREFIX --host=amd64-linux-gnu --build=amd64-linux-gnu --with-newlib --without-headers --with-gnu-as --with-gnu-ld --disable-shared --disable-threads --disable-libssp --enable-languages=c
, я получаю сообщение об ошибкеcrt1.o, -lc, crti.o
не найдено. Я думаю, что это из-за проблем с sysroot, но когда я устанавливаю свой sysroot черезCFLAGS
, я думаю, что это приводит к «конфигурации: ошибка: компилятор C не может создавать исполняемые файлы».См. coderhelper.com/q/6329887/1216776 для различных возможностей