1、构建嵌入式Linux编译环境,2,什么是交叉编译?,在嵌入式开发中经常会提到交叉编译的概念,那么究竟什么是交叉编译呢?交叉编译就是,在一种体系结构下的机器上编译出能够在另外一种体系结构下运行的应用程序的编译过程,3,交叉编译器从何而来?,交叉编译器是通过编译一系列GNU工具及库文件得到的,这些工具包括: Binutils: GNU的一个工具包,其中包括汇编器、连接器、归档器等等一系列工具 Gcc:主要提供C语言编译器,同时还支持其它多种语言 Glibc:提供标准的C/C+库 Kernel include files:为建立bootstrap gcc提供内核头文件,4,构建编译环境的整体流程,5
2、,构建步骤,下载Binutils、gcc、glibc以及内核源代码,和针对该版本的补丁 通过本机上的gcc编译Binutils,生成汇编器、连接器等编译工具 编译gcc源码生成bootstrap gcc,用来编译glibc 使用bootstrap gcc结合glibc和内核源码,便以生成glibc的标准c库 再次编译gcc源码,生成完整的gcc编译器,包含g+编译器,6,详细步骤(一),下载Binutils、gcc、glibc、内核源代码及相关版本的补丁 所有的GNU工具都可以到GNU的官方网站上下载http:/www.gnu.org 内核源代码下载地址http:/www.kernel.org
3、/ 针对ARM体系机构的补丁http:/www.arm.linux.org.uk/,7,详细步骤(二),建立工作目录为了使我们的编译结果更清晰,更规范,我们就必须建立一列的工作目录,$pwd /home/liang $mkdir embedded $cd embedded $mkdir build-tools kernel tools $ls build-tools kernel tools,总的工作目录,编译工具目录,内核源码目录,生成工具链目录,8,详细步骤(二),声明环境变量,$export PRJROOT=/home/zxt/embedded $export TARGET=arm-li
4、nux $export PREFIX=$PRJROOT/tools $export TARGET_PREFIX=$PREFIX/$TARGET$export PATH=$PREFIX/bin:$PATH,9,详细步骤(二),建立build-tools下子目录为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译,$cd $PRJROOT/build-tools $mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch,编译binutils的目录,编译bootstrap gcc
5、的目录,编译全部gcc的目录,编译glibc的目录,gcc补丁,10,详细步骤(二),将各个工具包的源代码放置在build-tools 目录下解压缩各个工具包,$ls binutils-2.10.1.tar.bz2 build-gcc gcc-patch build-binutls build-glibc glibc-2.2.3.tar.gz build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz,11,详细步骤(三),配置内核并生成内核头文件 对内核源码下include目录进行修改,$cd include $ln -s
6、 asm-arm asm $cd asm $rm arch proc $ln -s arch-s3c2410 arch $ln -s proc-armv proc,For 32bit ARM,针对不同的平台使用不同的arch,12,详细步骤(三),配置内核生成头文件生成所需的内核头文件,$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig,体系结构,交叉编译工具,include/linux/version.h include/linux/autoconf.h,13,详细步骤(三),安装内核头文件到$TARGET_PREFIX目录下,$mkdir
7、-p $TARGET_PREFIX/include $cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm,14,详细步骤(四),编译并安装Binutils,15,16,详细步骤(五),修改 gcc配置内容修改gcc-2.95.3源码中gcc/config/arm/t-linux文件的配置内容。 修改TARGET_LIBGCC2-CFLAGS = -f
8、omit-frame-pointer -fPIC 配置内容为:,TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D_gthr_posix_h,17,详细步骤(五),编译并安装bootstrap gcc,$cd build-boot-gcc $/gcc-2.95.3/configure -target=$TARGET -prefix=$PREFIX -without-headers -enable-languages=c-disable-threads $make all-gcc $make install-g
9、cc,现在还没有glibc头文件,只支持C语言,去掉thread功能,因为需要glibc的支持,18,19,详细步骤(六),建立glibc库 为glibc打补丁,$cd $PRJROOT/build-tools $tar -xvzf glibc-2.2.3.tar.gz $tar -xzvf glibc-linuxthreads-2.2.3.tar.gz -directory=glibc-2.2.3,为glibc打上thread补丁,20,详细步骤(六),配置glibc,$cd build-glibc $CC=arm-linux-gcc /glibc-2.2.3/configure -host
10、=$TARGET -prefix=“/usr“ -enable-add-ons -with-headers=$TARGET_PREFIX/include,指定使用bootstrap gcc,使用thread包,指定内核头文件位置,$make $make install_root=$TARGET_PREFIX prefix=“ install,21,详细步骤(六),修改$TARGET_PREFIX/lib 目录下的libc.so 修改前修改后原因 这样修改以后链接器ld就会在libc.so目录下搜索它所需要的库,GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a),GROUP ( libc.so.6 libc_nonshared.a),22,23,详细步骤(七),建立完整的gcc,$cd $PRJROOT/build-tools/build-gcc $/gcc-2.95.3/configure -target=$TARGET -prefix=$PREFIX -enable-languages=c,c+,$make all $make install,指定支持c和c+语言,24,25,工具链结构,26,27,感谢您参加博创嵌入式教学培训!,