Сбой сборки кросс-компилятора MIPS GCC: "не могу найти -lc"
Я пытаюсь настроить кросс-компилятор GCC 4.9.4 для QCA955X
на базе роутера с Linux 2.6.31. Это процессор MIPS32R2-abi, который использует uClibc-0.9.30.1
(как найдено в /lib
.) В связи с этим я решил скомпилировать GCC 4.x с соответствующим uClibc и binutils-2.19.1a
, Моя хост-система - Ubuntu 18.04 с Linux 4.17-rc5 и gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
~/mips-cross-gcc/staging_dir
мой префикс, и ~/mips-cross-gcc/staging_dir/sysroot
это временный системный корень для моей системы.
1) я скачал binutils-2.19.1a.tar.bz2
, gcc-4.9.4.tar.bz2
, linux-2.6.31.9.tar.xz
, а также uClibc-0.9.30.1.tar.bz2
в ~/mips-cross-gcc/sources
,
2) Я распутал все источники.
3) Установите заголовки Linux:
make ARCH=mips INSTALL_HDR_PATH=/home/user/mips-cross-gcc/staging_dir/sysroot/usr headers_install
4) Сборка binutils:
cd binutils-2.19.1
./configure --prefix=/home/user/mips-cross-gcc/staging_dir --target=mips-linux-uclibc --disable-multilib --disable-werror --enable-shared --without-newlib --with-sysroot=/home/user/mips-cross-gcc/staging_dir/sysroot --enable-languages=c,c++ --disable-libgomp
make all-binutils
make all-ld
make all-gas
make install-binutils
make install-ld
make install-gas
5) Создайте gcc "stage 1", чтобы запустить uClibc:
cd gcc-4.9.4
mkdir -p build/gcc-stage1
../../configure --target=mips-linux-uclibc --prefix=/home/user/mips-cross-gcc/staging_dir --disable-werror --disable-libgomp --without-newlib --disable-multilib --enable-languages=c,c++ --enable-shared --disable-__cxa_atexit --enable-target-optspace --disable-nls --disable-libmudflap --disable-libssp --with-float=soft --with-sysroot=/home/user/mips-cross-gcc/staging_dir/sysroot --with-gnu-ld --without-headers
make all-gcc
make install-gcc
6) Установите заголовки uClibc:
cd uClibc-0.9.30.1
make PREFIX=/home/user/mips-cross-gcc/staging_dir/sysroot install_headers
7) Сборка libgcc для целевой арки: cd gcc-4.9.4 make all-target-libgcc
Libgcc компилируется вплоть до финальной стадии связывания libgcc_s:
/home/daniel/mips-cross-gcc/staging_dir/mips-linux-uclibc/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
Makefile:937: recipe for target 'libgcc_s.so' failed
Я думал, что загрузиться GCC
не потребует libc
потому что он еще не скомпилирован, верно? Что я могу делать не так? Я бы использовал этот скомпилированный GCC
строить uClibc
, а затем я снова скомпилирую GCC с моим новым uClibc
так что я могу кросс-компилировать программное обеспечение. Дело в том, что GCC
требует libc
в первой сборке кажется неправильным.
Я пытался использовать первый gcc
без компиляции libgcc
для строительства uClibc
, но почти мгновенно я получил:
LD ld-uClibc-0.9.30.1.so
mips-linux-uclibc-gcc: error: libgcc.a: No such file or directory
ldso/ldso/Makefile.in:54: recipe for target 'lib/ld-uClibc.so' failed
Так, uClibc
потребности libgcc
связать себя, и GCC нужен libc
(любого типа, в том числе uClibc
) связать свой libgcc
, Это похоже на проблему курицы и яйца. Как можно это исправить?
1 ответ
Я починил это. По-видимому, GCC должен быть собран без использования общих библиотек (--disable-shared
), чтобы он не связывал сгенерированные библиотеки как libgcc
динамически (т.е. libc
, но это все еще не сработало. -lc
был все еще не найден.
Я немного погуглил и нашел полезное сообщение от eglibc о создании собственной цепочки инструментов с gcc: eglibc.org
Первый GCC
Для нашей работы нам необходим кросс-компилятор, ориентированный на систему PowerPC Linux. Однако эта конфигурация включает в себя общую библиотеку 'libgcc_s.so', которая скомпилирована с заголовками EGLIBC (которые мы еще не установили) и связана с 'libc.so' (которую мы еще не создали).
К счастью, есть параметры конфигурации для GCC, которые запрещают сборку libgcc_s.so. Опция '--without-headers' должна позаботиться об этом, но ее реализация не завершена, поэтому вы также должны сконфигурировать с опцией '--with-newlib'. Хотя "--with-newlib", по-видимому, означает "Использовать библиотеку Newlib C", его эффект заключается в том, чтобы сообщить механизму сборки GCC: "Не думайте, что библиотека C доступна".
Похоже, что при достаточном копании кто-то обязательно найдет точную проблему.
Короче меняюсь --enable-shared
в --disable-shared
и добавление --with-newlib
в GCC ./configure
решил проблему и скомпилировал + связал libgcc_s.so
что я использовал для компиляции uClibc, а затем перекомпилировал gcc с недавно сгенерированным libc из uClibc. Действительно, возможно скомпилировать GCC 4.x 2016 года с 2011 uClibc
на 2018 GCC 7.x.