查看: 3173|回复: 2
收起左侧

[已解决] 关于在X86的Archlinux上编译针对armv7l的交叉编译工具链

 关闭 [复制链接]
AR9412
发表于 2016-8-13 00:09:06 | 显示全部楼层 |阅读模式
本帖最后由 AR9412 于 2016-8-13 22:01 编辑

大家好,本人新手,这次试着自己制作X86->ARM的交叉编译工具链,有一些问题想请教。
先说一下环境:
本机:x86_64-pc-linux-gnu
目标机:armv7l-unknown-linux-gnueabihf
本机是Archlinux系统,目标机运行ArchlinuxARM,都用的是glibc。
我参考了clfs 3.0的"Chapter 5. Constructing Cross-Compile Tools"这一章,下面是我制作交叉编译工具链的步骤:
先设置一下环境变量:
[mw_shl_code=shell,true]export PREFIX=/home/localdog/tmp/build_dir
export PATH=/home/localdog/tmp/build_dir/bin:$PATH[/mw_shl_code]
1.编译binutils:
[mw_shl_code=shell,true]AR=ar AS=as ../configure \
--prefix=$PREFIX --host=x86_64-pc-linux-gnu --target=armv7l-unknown-linux-gnueabihf --disable-nls \
--disable-static --disable-multilib --disable-werror
[/mw_shl_code]2.获得目标系统的内核头文件:
[mw_shl_code=shell,true]make mrproper
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=$PREFIX headers_install
[/mw_shl_code]3.编译第一阶段的gcc:
[mw_shl_code=shell,true]AR=ar LDFLAGS="-Wl,-rpath,$PREFIX/lib" \
../configure --prefix=$PREFIX \
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=armv7l-unknown-linux-gnueabihf \
--with-native-system-header-dir=$PREFIX/include --disable-nls \
--disable-shared --without-headers --with-newlib --disable-decimal-float --disable-libgomp \
--disable-libmudflap --disable-libssp --disable-libatomic --disable-libitm \
--disable-libsanitizer --disable-libquadmath --disable-threads \
--disable-multilib --disable-target-zlib --with-system-zlib \
--enable-languages=c --enable-checking=release
[/mw_shl_code]4.编译目标系统的glibc:
[mw_shl_code=shell,true]BUILD_CC="gcc" CC="armv7l-unknown-linux-gnueabihf-gcc" \
AR="armv7l-unknown-linux-gnueabihf-ar" RANLIB="armv7l-unknown-linux-gnueabihf-ranlib" \
../configure --prefix=$PREFIX \
--host=armv7l-unknown-linux-gnueabihf --build=x86_64-pc-linux-gnu \
--disable-profile --enable-kernel=2.6.32 \
--with-binutils=$PREFIX/bin --with-headers=$PREFIX/include \
--enable-obsolete-rpc libc_cv_ssp=no
[/mw_shl_code]5.编译第二阶段的gcc:
[mw_shl_code=shell,true]AR=ar LDFLAGS="-Wl,-rpath,$PREFIX/lib" \
../configure --prefix=$PREFIX \
--build=x86_64-pc-linux-gnu --target=armv7l-unknown-linux-gnueabihf --host=x86_64-pc-linux-gnu \
--with-native-system-header-dir=$PREFIX/include --disable-nls \
--disable-static --enable-languages=c,c++ --enable-__cxa_atexit \
--disable-multilib \
--with-system-zlib \
--enable-checking=release --enable-libstdcxx-time
[/mw_shl_code]然后make:
[mw_shl_code=shell,true]make AS_FOR_TARGET="armv7l-unknown-linux-gnueabihf-as"\
LD_FOR_TARGET="armv7l-unknown-linux-gnueabihf-ld"
[/mw_shl_code]得到错误:
./gthr-default.h:35:21: fatal error: pthread.h: No such file or directory

对于编译通过的步骤我都没有写make的过程,我确认每一步都执行了make install


现在有几个问题是我不明白的:
1.编译第二阶段的gcc之前不需要make clean吗?clfs的book上没有写。
2.为何clfs的book上写第二阶段的gcc只需要
make AS_FOR_TARGET="armv7l-unknown-linux-gnueabihf-as"\
LD_FOR_TARGET="armv7l-unknown-linux-gnueabihf-ld",而不需要从头编译一次?
3.为何会出现找不到头文件的错误?我应该已经编译并安装好了目标系统的glibc了。


更新:如果第二阶段gcc的configure中加上--disable-threads的话会出现:
/home/localdog/tmp/build_dir/armv7l-unknown-linux-gnueabihf/bin/ld: cannot find crtn.o: No such file or directory
这个也是glibc的问题吧?
woodelf
发表于 2016-8-13 11:33:19 | 显示全部楼层
没用过交叉编译,仅以我的LFS/CLFS经验回答一些吧:
1、LFS/CLFS Book虽然没有在每一步骤明确说明,但是工具链每一轮编译安装完成后,都是需要删除临时编译目录的,否则目标工具链会被宿主机的工具链污染。
2、第二轮gcc编译的目的是用目标平台的工具链重新编译一次(自举),剔除宿主机工具链的污染。而第一轮gcc编译的目的是从头构建目标平台工具链,所以会稍微繁琐一点。
3、头文件找不到,是不是没设置头文件路径的环境变量?具体可以自己放狗搜一下。







    来自:Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0  (zh-CN)
    ——2016/8/13 上午11:33:19
    AR9412
     楼主| 发表于 2016-8-13 22:01:05 | 显示全部楼层
    woodelf 发表于 2016-8-13 11:33
    没用过交叉编译,仅以我的LFS/CLFS经验回答一些吧:
    1、LFS/CLFS Book虽然没有在每一步骤明确说明,但是工 ...

    感谢对1、2问的回答,
    对于第三个问题,问题在于glibc把库都安装在/build/下面,gcc只在/build/armv7l-unknown-linux-gnueabihf下面找,现在也解决了。
    再次感谢。
    您需要登录后才可以回帖 登录 | 快速注册

    本版积分规则

    手机版|杀毒软件|软件论坛| 卡饭论坛

    Copyright © KaFan  KaFan.cn All Rights Reserved.

    Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-11-30 20:29 , Processed in 0.129411 second(s), 16 queries .

    卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

    快速回复 客服 返回顶部 返回列表