2.2.3 准备工作
1.新建普通用户vita
为了避免误操作给宿主系统带来灾难性的后果,在编译过程中我们使用普通用户,避免不小心使用新编译的某些库覆盖宿主系统的库。我们新建一个普通用户vita:
我们还要新建一个组vita,用户vita属于这个组。参数"-m"表示创建vita用户的属主目录,默认是/home/vita;"-s/bin/bash"表示使用bash shell;"-g vita"表示将vita加入组vita。
在某些情况下,我们可能需要使用vita执行一些超级用户才有权限执行的命令,因此,我们让vita成为sudoers,在/etc/sudoers.d目录下添加一个文件vita,其内容如下:
2.建立工作目录
为了便于管理,我们需要建立一个工作目录,这个目录可以建立在任一目录下。笔者使用了一个单独的分区,并且挂载在/vita目录下。在该目录下,建立相应的工作目录的方法如下:
其中,source目录中存放的是源代码;build目录用作编译;cross-tools目录保存交叉编译工具。因为在整个编译过程中,编译器将被编译两次,所以cross-gcc-tmp用来保存临时的freestanding编译器,避免这个临时的freestanding编译器污染最后的工具链。编译好的目标机器上的文件安装在sysroot目录下,sysroot目录相当于目标系统的根文件系统。另外,我们使用chown更改这些目录的属主和属组,使vita用户有权限使用这些目录及目录下的文件。
3.定义环境变量
为了简化编译过程中的一些命令,我们需要定义一些环境变量。同时为了避免每次切换到vita用户时,都需要手动重新定义,我们将其定义在/home/vita/.bashrc中。
如果使用的是中文环境的操作系统,那么为了避免不必要的麻烦,要在环境中将其设置英文环境,即上面的unset LANG,因为,在中文环境下,有些工具,比如readelf,在输出ELF文件的信息时,多此一举地将很多英文翻译为了中文,可能给有些脚本处理工具带来一些麻烦。
为了使后面的构建过程可以找到的交叉编译工具,我们将安装交叉编译工具的目录添加到环境变量PATH中,包括临时的GCC存储的目录。注意一点,临时的GCC存储的目录一定要在最终正式的工具链目录的后面,确保安装最终的交叉编译器后,在编译时将优先使用最终的交叉编译器。
Binutils、GCC以及Glibc的配置脚本中均包含三个配置参数:HOST、BUILD和TARGET,这三个配置参数的值均是大致形如ARCH-VENDOR-OS三元组的组合。在编译前,可以通过配置选项设定这几个参数的值。如果配置时不显示指定这几个参数,编译脚本将自动探测编译所在的机器的相关值。
读者可以通过查看变量MACHTYPE,或者查看编译时配置过程的结果,确定机器的三元组。以笔者的机器为例,该值为i686-pc-linux-gnu,表示机器的CPU型号为i686,vendor为none,操作系统为linux-gnu。
如果HOST的值和TARGET的值相同,那么编译脚本就构建本地编译工具。只有当HOST和TARGET的值不同时,编译脚本才构建交叉编译工具。因此,虽然目标平台也是x86架构的,但是为了使用交叉编译的方式,我们在配置时故意显示设置TARGET参数为i686-none-linux-gnu,如此,TARGET就会与编译脚本自行检测到的HOST(对于笔者的机器来说,即i686-pc-linux-gnu)不同,从而构建交叉编译工具。读者可根据自己的具体环境进行调整,总之,要使TARGET与HOST不同。为了方便在编译时设置配置参数,因此我们定义了环境变量BUILD、HOST和TARGET。
4.切换到vita用户
准备工作完成后,我们使用如下命令切换到vita用户:
注意,这里我们切换到vita用户使用的是"su-"而不是"su"。后者只是切换了身份,shell的环境仍然是原用户的shell环境,而前者将shell环境也切换到了vita。