Я пытаюсь настроить кросс-компилятор 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
.Это похоже на проблему курицы и яйца.Как можно это исправить?