MIPS GCC交叉编译器构建失败:“找不到-lc”

时间:2018-06-01 14:10:12

标签: c linux gcc cross-compiling uclibc

我正在尝试为基于QCA955X的Linux 2.6.31路由器设置GCC 4.9.4交叉编译器。这是一个使用uClibc-0.9.30.1的MIPS32R2-abi CPU(如/lib中所示。)因此,我决定使用匹配的uClibc和binutils-2.19.1a编译GCC 4.x.我的主机系统是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是我系统的临时sysroot。

1)我将binutils-2.19.1a.tar.bz2gcc-4.9.4.tar.bz2linux-2.6.31.9.tar.xzuClibc-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)构建“stage 1”gcc,以引导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)为目标arch构建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,然后我将使用我的新uClibc再次编译GCC,以便我可以交叉编译软件。 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 :(得分:1)

我修好了。显然,GCC必须在没有启用共享库的情况下构建(--disable-shared),这样它就不会动态链接生成的库,如libgcc(即libc},但仍然没有工作。 -lc仍未找到。

我做了一些谷歌搜索,我发现这个来自eglibc的有用信息,关于使用gcc创建自己的工具链:eglibc.org

  

第一届海湾合作委员会

     

对于我们的工作,我们需要一个针对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解决了这个问题并编译了+链接了我用来编译uClibc的libgcc_s.so,然后用uClibc从新生成的libc重新编译了gcc。实际上,可以在2018年GCC 7.x上编制2016年GCC 4.x和2011年uClibc