打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CLFS2.0学习

主要是看了youbestLFS2原理分析的文章,似懂非懂的,想说什么又说不出来

环境变量的设置

glibc-2.4-crosscompile_timezone_fix-1.patch 

刚刚学习了CLFS-1.0.0rc4的书,了解其工具链制作过程,这里根据youbest的文章学习CLFS2的工具链制作方式

同步阅读版本号SVN-2.0.0-20060831-ARM书,好像这里生成的恰好是arm-linux.gcc….

 

同样先是环境变量设置,CLFS_HOST,CLFS_TARGET=”arm-unknow-linux-gnu”,还先设置了文件系统和passwdgrouplog文件等,

 

具体工具链的制作:

只需要${CLFS}/cross-tools,不需要CLFS1中的${CLFS}/tools目录了,应该可以理解直接把${CLFS}看出clfs1中的tools目录

1,    Linux-Headers文件的安装

Youbest说的要在复制前加一句  make include/linux/version.h没看懂,不知道何意思

2,    交叉Binutils安装

    ../binutils-2.17/configure --prefix=${CLFS}/cross-tools \
   --host=${CLFS_HOST} --target=${CLFS_TARGET} --with-sysroot=${CLFS} \
   --disable-nls --enable-shared --disable-multilib

 

参数的理解跟clfs1一样,里面最关键的是,也是新加入的就是 with-sysroot=${CLFS}参数了,是clfs2的精华,把$CLFS目录作为根目录

 

这个交叉版本binutils是用主系统的binutilsgcc实现的,我们的主系统是i386(目标系统是arm),这个用主系统中工具链编译出来的binutils当然是在主系统上运行的,

3,  Glibc头文件的安装

先看后面的gcc

BOOK是为了编译arm的,为了glibc支持arm,需要glibc-ports-2.4

Echo install_root=${CLFS} > configparms, 指定安装的根目录

CC=gcc ../glibc-2.4/configure --prefix=/usr \
   --host=${CLFS_TARGET} --build=${CLFS_HOST} \
   --with-headers=${CLFS}/usr/include --cache-file=config.cache

Gcc用的是主系统的gcc,注意最后安装的目录其实是${install_root}/prefix下,注意--hostbuild的意思,这里hostTARGETbuildHOST,这样,第4步中的gcc就指定了TARGET的信息了

--with-headers指定使用的头文件,glibc唯一必须要的头文件就是内核头文件,因为glibc也是支持都平台的,这样第2步内核头文件必须先于glibc安装,这样glibc才“知道”准确的内核信息

Makeinstall-headers,  安装glibc的头文件,不需要交叉版gcc(此时也没有),相反交叉版gcc的得到是需要这里的头文件,因而先用主系统的gcc得到这些交叉用的头文件先

4,  交叉GCC,静态

    ../gcc-4.1.1/configure --prefix=${CLFS}/cross-tools \
    --host=${CLFS_HOST} --target=${CLFS_TARGET} --disable-multilib \
    --with-sysroot=${CLFS} --disable-nls --disable-shared \
    --enable-languages=c

交叉版静态gcc被安装到${CLF}/cross-tools,只编译c语言部分,同时以${CLFS}为根目录。

这里要深刻理解交叉编译的意思,明确要得到交叉版gcc要编译出在目标体系上运行的二进制代码,需要知道符合目标体系的头文件,主要是内核头文件何glibc头文件,另外,自身交叉版gcc也要“知道”目标体系的细节,这就要求它“出生”就知道,这就要求编译生成交叉版gcc是就先要有目标系统的glibc头文件,这就到了第3步中glibc头文件的安装

5,  此时有了交叉版gcc和交叉版binutils,还有目标系统的glibc头文件,正式编译glibc库,

   echo"install_root=${CLFS}" > configparms

BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc" \
    AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \
    ../glibc-2.4/configure --prefix=/usr --libexecdir=/usr/lib/glibc \
    --host=${CLFS_TARGET} --build=${CLFS_HOST} \
    --disable-profile --enable-add-ons \
    --with-tls --enable-kernel=2.6.0 --with-__thread \
    --with-binutils=${CLFS}/cross-tools/bin --with-headers=${CLFS}/usr/include \
    --cache-file=config.cache

这里根clfs1中的glibc编译很相似,最后安装到的是${install_root}/usr${install_root}/usr/lib/glibc

接下来的locales安装就可以省略,因为localedefglibc中标准程序,而glibc是用于目标平台的

6,  最终动态交叉版gcc

这里要搞清楚整个工具链的由来,这次的gcc,还是由主系统的gccbinutils生成,只是生成的是动态链接的,包含cc++,链接的C库也是主系统的,这样出来的gcc才能在主系统上运行,注意不是链接的新编出来的glibc,(这里感觉youbest说的有点矛盾了,第一遍的静态的交叉gcc,只包含c,只需要目标体系glibc头文件 ,第二编动态交叉gcc,包含cc++,应该需要一部分链接到主系统glibc,一部分链接到目标体系glibc,如果这里动态交叉gcc生成完全不链接目标体系glibc,那么完全可以只编一遍交叉gcc了,youbest是说编译一个支持交叉的c++,必须有一个编译好的用于目标体系的glibc,所以还是说得出最终的完整的交叉版gcc是要链接到目标体系的glibc的)

../gcc-4.1.1/configure --prefix=${CLFS}/cross-tools \
    --host=${CLFS_HOST} --target=${CLFS_TARGET} --disable-multilib \
    --with-sysroot=${CLFS} --disable-nls --enable-shared \
    --enable-languages=c,c++ --enable-__cxa_atexit \--enable-c99 --enable-long-long

   

 

至此,交叉工具链/cross-tools的基本工具就够了

 

再准确理解with-sysroot这个参数

 

先要了解gcc在编译过程中搜索头文件的顺序,已经binutil或者说ld工具搜索库文件的路径顺序,可以理解这个with-sysroot就是改变gccld搜索的默认路径的方式,在它们默认搜索路径,比如/usr/include,/lib,/usr/lib前加上{--with-sysroot}路径,当没有这个参数时,{--with-sysroot}表示的是空字符串,在这里,我们指定了with-sysroot,那么在编译的时候查找头文件以及连接时查找动态或静态库就自动到with-sysroot指定的路径下来找,这个参数只支持交叉编译的时候

 

 在编译交叉binutils和交叉静态gcc时用到了with-sysroot,那么用这些交叉工具编译交叉的glibc时,他们搜索头文件和链接库文件,会到{CLFS}/usr/include,{CLFS}/lib等目录下去找

 

在接下来的第六章基本的目标系统的构建,都是利用我们做好的交叉工具链和主系统的一些实用程序编出来的,这些程序是不能在本地系统运行的,是用于目标系统的,这章的包编译的顺序就不那么严格了,因为不象LFS中编译一个新工具,力马就使用这个工具的,这时交叉工具链中的binutilsgccwith-sysroot发挥着重要作用,它们在没有路径补丁的情况下,能“顺利”着找着用于目标体系的头文件和库

 

考察这种用主系统的工具包和交叉工具链共同编译用于目标系统的程序的“纯洁度”

交叉工具链肯定没问题,主系统的工具都是一些处理文本之类的与平台无关的文件,不会影响系统纯净度,只有当主系统提供的命令不适合或版本太低,就需要象工具链中filegroff一样编译一个了,而其实它们也不是交叉版的

 

 

再看第六章中编出的程序的安装问题,尽管这些程序配置选项中prefix/usr,但安装的时候都带有 DESTDIR=${CLF} 选项,其实还是安装到了DESTDIR/prefix下,跟--with-sysroot有点相似啊

 

 

最后使目标系统可启动,就比较好理解了,跟clfs1也类似,看看就明白了,关于armbook中没有具体提到,就自己做bootloader

 

 

正在请教youbest问题ing


 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
交叉编译器 制作分析(CLFS2.0原理分析)
Building a GNU/Linux ARM Toolchain (from scratch)
交叉编译gcc
arm-linux-gcc 3.4.4
Cross Toolchain-交叉编译工具链
建立ARM交叉编译环境 (arm
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服