嵌入式linux系统构建(1)

2019-07-12 19:38发布

   obinutils功能: n汇编语言(.s)>目标文件->可执行程序 n查看二进制文件信息 o组成:一组可执行程序 nasld nobjdumpreadelfar …… o支持多种目标机   oglibc功能: n提供语言和操作系统的标准库函数 o组成:若干可执行程序 + 大量库 nlddiconvlocale…… nISO CPOSIXUNIXGNU o 绝大部分与目标机无关 制作开发工具 交叉工具链的建立: 建立工具链的第一步就是选择我们将要使用的组建版本 这包括:binutils ,gcc,glibc binutils中:主要的工具有as汇编器,ld链接器,objdump显示目标文件内容有关信息,readelf 显示elf文件有关信息。        as [option...] [asmfile...] n汇编器,可由gcc -c代替 old [options] file... n连接器,可由gcc代替 o binutils提供许多二进制工具,没有binutils,gcc无法正常工作。   oobjdump [option(s)] [file(s)] n反汇编各种格式的目标文件和可执行程序 o常用选项: n-d o只反汇编代码段 n-D o反汇编代码段和数据段 n-S o混合输出源代码和汇编代码,编译时必须加-g选项   通常由gcc调用,一般不直接使用   binutils中:主要的工具有as汇编器,ld链接器,objdump显示目标文件内容有关信息,readelf elf文件有关信息。       1 设置环境变量,准备源码及相关补丁
1.1 设置环境变量
[arm@localhost arm]#vi ~/.bashrc
export PREFIX=/usr/local/arm/3.4.4//指定安装目录
export TARGET=armlinux//指定目标
export SYSROOT=${PREFIX}/sysroot
export ARCH=arm  //目标板体系结构
export CROSS_COMPILE=${TARGET}export 
PATH=${PREFIX}/bin:$PATH //可执行文件路径
export SRC=/home/arm/dev_home/btools/tchain3.4.4   //以上的环境变量的设置也可以看看书,感觉书上说的比较正规 .P123   1.5 准备内核头文件
1.5.1 使用当前平台的gcc编译内核头文件
[arm@localhost tchain3.4.4]#cd ${KERNEL}
[arm@localhost kernel]#tar xvfz linux2.6.14.1.
tar.gz
[arm@localhost kernel]#cd linux2.6.14.1
[arm@localhost linux2.6.14.1]#make ARCH=arm menuconfig
[arm@localhost linux2.6.14.1]#make
1.5.2 复制内核头文件
[arm@localhost kernel]#su root
[root@localhost kernel]#mkdir p
${SYSROOT}/usr/include
[root@localhost kernel]#cp -a include/linux  ${SYSROOT}/usr/include/linux
[root@localhost kernel]#cp -a include/asmi386 ${SYSROOT}/usr/include/asm
[root@localhost kernel]#cp -a include/asmgeneric ${SYSROOT}/usr/include/asmgeneric
[root@localhost kernel]#exit
[arm@localhost kernel]#   以上是工具链所需要的include目录,并将内核头文件复制过去。 我的理解是:在建立目标文件之后,生成可执行文件中链接时,链接器ld就是在这个目录中,找要链接的库文件!   1.4 编译 GNU binutils
重新以arm用户登陆,让新设置的环境变量起作用.
[arm@localhost arm]#su arm
[arm@localhost arm]#cd ${SRC}
[arm@localhost tchain3.4.4]#tar xzvf binutils2.16.tar.gz
[arm@localhost tchain3.4.4]#mkdir -p BUILD/binutils2.16
[arm@localhost binutils2.16]#cd BUILD/binutils2.16
[arm@localhost binutils2.16]#../../binutils2.16/configure prefix=${PREFIX} target=${TARGET}withsysroot=${SYSROOT}
[arm@localhost binutils2.16]# make
[arm@localhost binutils2.16]# su root
[root@localhost binutils2.16]# make install
[root@localhost binutils2.16]# exit
[arm@localhost binutils2.16]#   1.configure 执行为每个工具程序产生适当的Makefile 2.make 编译binutils 3.make install 安装binutils   1.6 译编glibc头文件
[arm@localhost kernel]#cd ${SRC}
[arm@localhost chain3.4.4]#tar xvfz glibc2.3.5.tar.gz
[arm@localhost chain3.4.4]#patch dglibc2.3.5p1< ioperm.c.diff
[arm@localhost glibc2.3.5]#cd glibc-2.3.5
[arm@localhost glibc2.3.5]#tar xvfz /glibclinuxthreads2.3.5.tar.gz/glibc的附加包
[arm@localhost chain3.4.4]#cd ..
[arm@localhost chain3.4.4]#mkdir BUILD/glibc2.3.5headers
[arm@localhost chain3.4.4]#cd BUILD/glibc2.3.5headers
[arm@localhost glibc2.3.5headers]#../../glibc2.3.5/configure prefix=/usrhost=${TARGET} /enableaddons=
linuxthreads –withheaders=${SYSROOT}/usr/include
[arm@localhost glibc2.3.5headers]#su root
[root@localhost glibc2.3.5headers]#make cross-compiling=yes,install_root=${SYSROOT} install-headers
[root@localhost glibc2.3.5headers]#touch${SYSROOT}/usr/include/gnu/stubs.h
[root@localhost glibc2.3.5headers]#touch${SYSROOT}/usr/include/bits/stdio_lim.h
[root@localhost glibc2.3.5headers]#exit
[arm@localhost glibc2.3.5headers]#
注意: prefix=/usr :是gcc寻找库的搜索路径。
   因为我们没有将CC变量定义为既有的交叉编译器,所以我们必须把cross-compiling设置为yes,这样glibc的编译脚本才不会建立原生的链接库,最后是用 install-headers要求make安装头文件。 接下来,我们产生一个假的stubs.h(如上)文件,因为gcc在建立glibc时,需要这个文件(经交叉编译的glibc在安装期间可以产生该文件)。 下一步:我们可以建立引导程序Gcc编译器(如下步:)     引导编译器的设置: 与binutils相比,gcc套件只包含一个工具程序即:GNU编译器 1.7 编译gcc第一阶段
[arm@localhost glibc2.3.5headers]#cd ${SRC}
[arm@localhost chain3.4.4]#tar -xjvf gcc-3.4.4.tar.bz2
[arm@localhost chain3.4.4]#patch -d gcc-3.4.4p1< flow.c.diff
[arm@localhost chain3.4.4]#patch -d gcc-3.4.4p1< tlinux.diff
[arm@localhost chain3.4.4]#mkdir -p BUILD/gcc3.4.4stage1
[arm@localhost chain3.4.4]#cd BUILD/gcc-3.4.4stage1
[arm@localhost gcc3.4.4stage1]#../../gcc-3.4.4/configure prefix=${PREFIX}target=${TARGET} /enable-languages=c withsysroot=${SYSROOT}
注意:不能加上"disable-shared"
选项。
[arm@localhost gcc3.4.4stage1]#make all-gcc
[arm@localhost gcc3.4.4stage1]#su root
[root@localhost gcc3.4.4stage1]#make install-gcc
[root@localhost gcc3.4.4stage1]#exit
[arm@localhost gcc3.4.4stage1]#
  1.8 编译完整的glibc
[arm@localhost gcc3.4.4stage1]#cd ${SRC}
[arm@localhost tchain3.4.4]#mkdir BUILD/glibc2.3.5
[arm@localhost tchain3.4.4]#cd BUILD/glibc2.3.5
[arm@localhost glibc2.3.5]#BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar /RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld /../../glibc2.3.5/configure prefix=/usr build=i386-redhat-linux host=arm-unknown-linux-gnu/target=
arm-unknown-linux-gnu without__thread enable-add-ons=linuxthreads /--with-headers=${SYSROOT}/usr/include
明:
prefix:
指定安装路径。
target:
指定目标平台。
host:
指定当前平台。
build:
指定编译平台。
with-sysroot:

用于指定编译所需要的头文件,及链接库。
enable-add-ons://“下载”附加包
加入其它的库,如线程库等。
enable-languages:
指定gcc所支持的语言。
--with-headers其告诉命令配置脚本,何处可以找到,我们前面设置的内核头文件! [arm@localhost glibc2.3.5]#make
[arm@localhost glibc2.3.5]#su root
[root@localhost glibc2.3.5]#make install_root=${SYSROOT} install
[root@localhost glibc2.3.5]#exit
[arm@localhost glibc2.3.5]#
  1.9 编译完整的gcc
[arm@localhost glibc2.3.5]#cd ${SRC}
[arm@localhost tchain3.4.4]#mkdir BUILD/gcc3.4.4
[arm@localhost tchain3.4.4]#cd BUILD/gcc3.4.4
[arm@localhost gcc3.4.4]#../../gcc3.4.4/configure prefix=${PREFIX} target=${TARGET} /enable-languages=c with-sysroot=${SYSROOT}
[arm@localhost gcc3.4.4]#make
[arm@localhost gcc3.4.4]#su root
[root@localhost gcc3.4.4]#make install
[root@localhost gcc3.4.4]#exit
[arm@localhost gcc3.4.4]#
  ok! 交叉编译器搞定! 找个时间,自己动手实际做一做!!!!!   o