Сбой сборки кросс-компилятора MIPS GCC: «не могу найти -lc» - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь настроить кросс-компилятор 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 isскомпилирован полностью до последнего этапа компоновки 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 Ответ

0 голосов
/ 02 июня 2018

Я исправил это.Очевидно, что 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», по-видимому, означает «Использовать библиотеку C Newlib», его эффект - сообщить механизму сборки GCC: «Не думайте, что библиотека C доступна».

Похоже, при достаточном копании кто-то обязательно найдет точную проблему.

Короче говоря, изменение --enable-shared на --disable-shared и добавление --with-newlib к GCC ./configure решило проблему и скомпилировало + связало libgcc_s.so, которое я использовал для компиляции uClibc, а затем перекомпилировало gcc снедавно сгенерированный libc, из uClibc.Действительно, GCC 4.x 2016 года можно скомпилировать с GCC 2011x 2011 года uClibc на 7.x.

2018 года.
...