当前位置:首页 > linux实验三
实验三 分步构建交叉编译链
一、实验目的
1、理解交叉编译的原理,了解交叉编译工具链 2、掌握分步构建交叉编译工具链的方法 二、实验内容
实验在理解交叉编译原理和交叉编译工具链的基础上,分步构建交叉编译工具链,主要步骤如下:
(1)准备工作:下载好所需要的软件包,准备好内核头文件、组织好目录。 (2)编译Binutils:这个软件包的编译相对简单,一般容易实现。
(3)编译辅助gcc编译器:对gcc进行简单配置后,编译gcc,使其不依赖glibc,只对C语言支持,为后面glibc的编译做准备。
(4)编译glibc库:首先对解压的内核头文件进行配置。在上一步的编译过程中,已经生成arm-linux-gcc工具,利用该工具编译glibc库。
(5)重新编译完整的gcc:完整的gcc的编译需要glibc库的支持,在第一步的时候glibc还未被编译,所以只能简单配置,生成辅助的gcc,而在这一步,glibc库已经编译,可以使用,实现对gcc的完整编译。
(6)编译gdb调试器:调试器与前面的那些软件是相互独立的,因此最后编译。 三、实验过程
(1)准备工作:根据课本上编译工具链所需资源列表,下载所需的软件包并解压,放置在一特定文件夹中,通过设置实现虚拟机与物理机的文件共享。本实验中的共享文件夹为“Linux”。所需软件包如下:
(2)详细过程 1、建立工作目录
当前的用户为root,在用户目录下首先建立一个工作目录(armlinux),建立工作目录的命令行操作如下: # cd /root
# mkdir armlinux
在armlinux下建立3个目录 build-tools、kernel 和 tools。具体操作如下: # cd armlinux
# mkdir build-tools kernel tools
其中build-tools 用来存放下载的binutils、gcc、glibc等源代码和用来编译这些源代码的目录;kernel 用来存放内核源代码;tools 用来存放编译好的交叉编译工具和库文件。
2、建立环境变量
建立环境变量主要是用来将其定义为经常使用的路径,来代替直接路径,避免重复输入冗长的命令,简化输入过程,降低输错路径的概率。 具体命令如下:
3、编译、安装Binutils
首先解压binutils-2.16.1tar.bz2包,命令如下: # cd $PRJROOT/build-tools # tar –xjvf binutils-2.16.1.tar.bz2
接着配置Binutils工具,具体操作如下: # cd $PRJROOT/build-tools # mkdir build-binutils # cd build-binutils
# ../ binutils-2.16.1/configure --target=$TARGET --prefix=$PREFIX
其中选项–target的意思是制定生成的是 arm-linux 的工具,--prefix 是指出可执行文件安装的位置。执行上述操作会出现很多check信息,最后产生 Makefile 文件。
接下来执行make和安装操作,命令如下: # make
# make install
安装完成后查看/home/mike/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。
4、获得内核头文件
(1)在kernel目录下解压linux-2.6.15.tar.gz内核包,执行命令如下:
# cd $PRJROOT/kernel
# tar –xvzf linux-2.6.15.tar.gz
(2)接下来配置编译内核使其生成正确的头文件,执行命令如下:
# cd linux-2.6.15
# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig 在出现的界面中选择三星的S3C2410(System Type->ARM System Type->/Samsung S3C2410)配置完退出并保存,检查一下内核目录中的include/linux/version.h和include/linux/autoconf.h文件是不是生成了,这是编译glibc时要用到的,如果version.h 和 autoconf.h 文件存在,说明生成了正确的头文件。界面如下:
复制头文件到交叉编译工具链的目录,首先需要在/home/mike/armlinux/tools/arm-linux目录下建立工具的头文件目录inlcude,然后复制内核头文件到此目录下,具体操作如下:
# mkdir –p $TARGET_PREFIX/include
# cp –r $PRJROOT/kernel/linux-2.6.15/include/linux $TARGET_PREFIX/include
# cp –r $PRJROOT/kernel/linux-2.6.15/include/asm-arm $TARGET_PREFIX/include/asm
5、编译安装boot-trap gcc 安装命令如下:
# cd $PRJROOT/build-tools # tar –xvzf gcc-3.3.6.tar.gz # mkdir build-gcc # cd gcc-3.3.6
# vi gcc/config/arm/t-linux
由于是第一次安装ARM交叉编译工具,没有支持libc库的头文件,所以在gcc/config/arm/t- linux文件中给变量TARGET_LIBGCC2_CFLAGS增加操作参数选项-Dinhibit_libc -D__gthr_ posix_h来屏蔽使用头文件,否则一般默认会使用/usr/inlcude头文件。
将TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer –fPIC改为TARGET_LIBGCC2- CFLAGS=-fomit-frame-pointer–fPIC -Dinhibit_libc -D__gthr_posix_h
修改完t-linux文件后保存,紧接着执行配置操作,如下命令: # cd build-gcc # ../ gcc-3.3.6 /configure --target=$TARGET --prefix=$PREFIX --enable-languages=c
--disable-threads --disable-shared
其中选项--enable-languages=c表示只支持C语言,--disable-threads表示去掉thread功能,这个功能需要glibc的支持。--disable-shared表示只进行静态库编译,不支持共享库编译。
接下来执行编译和安装操作,命令如下: # make
# make install
安装完成后,在/home/mike/armlinux/tools/bin下查看,如果arm-linux-gcc等工具已经生成,表示boot-trap gcc工具已经安装成功。
6、建立glibc库
首先解压glibc-2.3.2.tar.gz和glibc-linuxthreads-2.3.2.tar.gz源代码,操作如下:
# cd $PRJROOT/build-tools # tar -xvzf glibc-2.3.2.tar.gz
# tar -xzvf glibc-linuxthreads-2.3.2.tar.gz --directory=glibc-2.3.2
然后进行编译配置,glibc-2.3.2配置前必须新建一个编译目录,否则在glibc-2.3.2目录下不允许进行配置操作,此处在$PRJROOT/build-tools目录下建立名为build-glibc的目录,配置操作如下: # cd $PRJROOT/build-tools # mkdir build-glibc # cd build-glibc
# CC=arm-linux-gcc ../glibc-2.3.2 /configure --host=$TARGET --prefix=\
--enable-add-ons --with-headers=$TARGET_PREFIX/include
配置完后就可以编译和安装 glibc了,具体操作如下: # make
# make install
7、编译安装完整的gcc
由于第一次安装的gcc没有交叉glibc的支持,现在已经安装了glibc,所以需要重新编译来支持交叉glibc。并且上面的gcc也只支持C语言,现在可以让它同时支持C语言还要和C++语言。具体操作如下: # cd $PRJROOT/build-tools/gcc-4.1.0
# ./configure --target=arm-linux --enable-languages=c,c++ --prefix=$PREFIX # make
# make install
安装完成后会发现在$PREFIX/bin目录下又多了arm-linux-g++ 、arm-linux-c++等文件。
8、制作交叉调试器
选择gdb-6.5,具体操作如下: #tar -jxf gdb-6.5.tar.bz2 #mkdir build-gdb #cd build-gdb
#../gdb-6.5/configure\\ >--target=arm-linux\\
>--prefix=/root/crosstool/toolchain
9、测试交叉编译工具链
写一个最简单的hello.c源文件,内容如下: #include
{ printf(“Hello,world!\\n”); return 0;}
通过以下命令编译生成名为hello的可执行文件,通过file命令查看文件的类型。当显示以下信息时表明交叉工具链正常安装了,通过编译生成了ARM体系可执行的文件。
# arm-linux-gcc –o hello hello.c # file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3, dynamically linked (uses shared libs), not stripped
四、实验总结
通过本次的试验逐渐的理解了交叉编译的原理,了解了交叉编译工具链 并且初步掌握了分步构建交叉编译工具链的方法!
共分享92篇相关文档