Сбой сборки кросс-компилятора 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.

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