1

我正在尝试为QCA955X基于 Linux 2.6.31 的路由器设置 GCC 4.9.4 交叉编译器。这是一个 MIPS32R2-abi CPU,它使用uClibc-0.9.30.1(在 中找到)/lib。因此,我决定用匹配的 uClibc 和binutils-2.19.1a. 我的主机系统是带有 Linux 4.17-rc5 的 Ubuntu 18.04 和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.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)构建“阶段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

我认为引导 aGCC不需要 a 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. 这似乎是一个先有鸡还是先有蛋的问题。如何解决这个问题?

4

1 回答 1

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解决了问题并编译 + 链接了libgcc_s.so我用来编译 uClibc 的 a,然后使用来自 uClibc 的新生成的 libc 重新编译 gcc。实际上,可以uClibc在 2018 GCC 7.x 上编译 2016 GCC 4.x 和 2011。

于 2018-06-02T04:52:30.163 回答