clfs
整个制作过程参考《手把手教你如何建立自己的Linux系统》
交叉编译
在一个系统平台生成另一个系统平台的程序,本次是在X86 Linux平台使用交叉编译工具链生成MIPS Linux平台的系统。交叉编译可以用来生成裁剪过的嵌入式系统或者不相同的平台。
字节序
大端,数据存放顺序和地址增长顺序相同;小端,数据存放顺序和地址增长顺序相反。
Build、Host和Target
在configure配置时,需要使用这三个参数,build表示编译软件使用的平台,host表示编译出来的软件运行的平台,target是软件处理的平台。当编译平台(build参数)和运行平台(host参数)不一致时,称为交叉编译。有些软件的target的参数可以不指定。在参数配置的是平台名称,比如i686-pc-linux-gnu,i686是指架构名称,pc是计算机类型,linux-gnu是操作系统,可以通过uname命令得到系统信息。
交叉工具链的制作
交叉工具链里的binutils和gcc用来生成目标平台的代码,在软件包的最开始要下载安装这两个软件。首先就是利用主系统的gcc和binutils编译生成binutils和gcc(此时的版本只是c语言版本,并不完整),再编译出交叉版本的binutil和gcc,与LFS不同,交叉版本的binutil和gcc使用的还是主系统的glibc。
sysroot
在configure配置过程中,使用—with-sysroot参数制定目录,然后编译链接的时候,在制定目录寻找头文件和函数库。DESTDIR设置和—with-sysroot参数作用一样。
虚拟根目录
Linux系统可以存在多个运行环境,每个运行环境都有自己的根目录。
平台参数
平台参数如果在配置过程中不指定则会进行自动探测,探测一般是由软件包中的config.guess脚本进行,该脚本会根据当前系统的uname等命令的返回值来进行判断,并最终返回猜测结果。通常猜测结果是准确的,但如果计算机或系统十分特别,则可能判断错误,这时就必须使用手工指定的方式。
例子:
i686-pc-linux-gnu
i686
架构名称,主要描述CPU的指令集,常用的还有个"pentinum"、“x86_64”、“mips”等。64位MIPS小端指令集,表示为“mips64el”
pc
运行计算机的类型,“pc”指个人计算机,不确定类型的计算机可以使用“unknown”来表示“未知”。
linux-gnu
“linux”和“gnu”合起来表示操作系统。
部分软件包
-
Linux-Header
-
原因:
比如glibc安装需要使用到linux的内核头文件,把头文件安装在dest目录下,然后使用cp命令复制到/loongson/usr/include目录下 Binutils
-
原因:
Binutils中有汇编、链接的命令工具,在glibc中会使用到binutils中的命令、头文件和动态链接库
使用sysroot制定安装目录为${TARGET_DIR},打上binutils-2.20-branch_update-1.patch补丁,因为是3A3000平台,所以不打上binutils-2.20-loongson2f-1.patch补丁 gcc(仅支持c语言)
-
原因:
安装编译器gcc,glibc需要使用gcc提供支持。在configure配置中有—enable-languages=c,本次仅支持glibc的编译,还不是完整的gcc,安装目录是在在目标系统
它是一个编译器集合,包括gcc -
正确性检查:
在${TARGET_DIR}/cross-tools/bin 目录下查找gcc命令,比如mips64el-unknown-linux-gcc glibc
-
原因:
建立目标系统的glibc:gcc目前仅对C语言的支持,如果需要完成交叉工具链中的GCC,还需要目标系统的Glibc才能完成GCC的编译。 -
–with-__thread参数:
强制Glibc打开线程支持功能,防止配置脚本对目标平台错误的判断 -
gcc-4.4.2-64-specs-1.patch:
该补丁将64位共享函数库文件链接目录改为标准的/lib目录,默认 gcc(支持c语言和c++语言)
-
原因:
目标系统的glibc已安装完毕,glibc为基础的交叉工具链。编译GCC,以Newlib为基础进行编译,编译“自给自足”的软件包。仅将GCC制作为支持C语言和C+