构建嵌入式Linux系统-开发工具

12 篇文章 0 订阅

构建嵌入式Linux系统-开发工具

一, 建立实际项目工作空间
工作环境配置脚本文件(develenv),内容如下:
#start------------------------------------------------------------------------------------
#! /bin/bash
#设置环境变量
export PROJECT=daq-module
export PRJROOT=~/control-project/${PROJECT}
export TARGET=arm-linux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=${PREFIX}/bin:${PATH}

#创建项目目录
mkdir ${PRJROOT} ${PRJROOT}/bootldr ${PRJROOT}/build-tools ${PRJROOT}/debug ${PRJROOT}/doc ${PRJROOT}/images ${PRJROOT}/kernel ${PRJROOT}/rootfs ${PRJROOT}/sysapps ${PRJROOT}/tmp ${PRJROOT}/tools

#创建build-tools目录
mkdir ${PRJROOT}/build-tools/build-binutils ${PRJROOT}/build-tools/build-boot-gcc ${PRJROOT}/build-tools/build-glibc ${PRJROOT}/build-tools/build-gcc

#创建工具链所需要的include目录
mkdir -p ${TARGET_PREFIX}/include

#根文件系统的基本结构
mkdir ${PRJROOT}/rootfs/bin ${PRJROOT}/rootfs/dev ${PRJROOT}/rootfs/etc ${PRJROOT}/rootfs/lib ${PRJROOT}/rootfs/proc ${PRJROOT}/rootfs/sbin ${PRJROOT}/rootfs/tmp ${PRJROOT}/rootfs/usr ${PRJROOT}/rootfs/var
chmod 1777 ${PRJROOT}/rootfs/tmp
mkdir ${PRJROOT}/rootfs/usr/bin ${PRJROOT}/rootfs/usr/lib ${PRJROOT}/rootfs/usr/sbin
mkdir ${PRJROOT}/rootfs/var/lib ${PRJROOT}/rootfs/var/lock ${PRJROOT}/rootfs/var/log ${PRJROOT}/rootfs/var/run ${PRJROOT}/rootfs/var/tmp ${PRJROOT}/rootfs/boot
chmod 1777 ${PRJROOT}/rootfs/var/tmp

#修改搜索路径:
export PATH=${PREFIX}/sbin:${PATH}

cd $PRJROOT
#end------------------------------------------------------------------------------------

二, GNU跨平台开发工具链
下载GNU工具链的各个组件: ftp://ftp.gnu.org/gnu
准备build-tools目录(见上面脚本)
目录中文件包括:binutils-2.10.1.tar.gz gcc-2.95.3.tar.gz glibc-2.2.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz

建立工具链程序概述:
1.内核头文件的设置
2.二进制工具程序的设置
3.引导编译器的设置
4.C链接库的设置
5.完整编译器的设置

三, 内核头文件设置
内核下载: http://www.kernel.org
将内核副本下载至${PRJROOT}/kernel目录.
$ tar xvzf linux-2.4.18.tar.gz 或 $ tar xvjf linux-2.4.18.tar.bz2
$ mv linux linux-2.4.18
$ cd linux-2.4.18
arm内核补丁
($ zcat ../patch-2.4.18-rmk5.gz | patch -p1)
$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

配置好内核后,将内核头文件复制过去.
$ cp -r include/linux/ ${TARGET_PREFIX}/include
$ cp -r include/asm-arm/ ${TARGET_PREFIX}/include/asm
$ cp -r include/asm-generic/ ${TARGET_PREFIX}/include
注:本例使用的是arm目标板,如果使用ppc或i386目标板,则必须将asm-arm替换成asm-ppc或asm-i386.

四, binutils的设置
$ cd ${PRJROOT}/build-tools
$ tar xvzf binutils-2.10.1.tar.gz
产生一个binutils-2.10.1目录
$ cd build-binutils
$ ../binutils-2.10.1/configure --target=$TARGET --prefix=${PREFIX}
$ make
$ make install
查看一下安装结果是否正确:
$ ls ${PREFIX}/bin

五, 引导编译器的设置
$ cd ${PRJROOT}/build-tools
$ tar xvzf gcc-2.95.3.tar.gz
产生gcc-2.95.3目录
$ cd build-boot-gcc
$ ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --without-headers --with-newlib --enable-languages=c
$ make all-gcc
$ make install-gcc
检查一下${PREFIX}/bin的内容看是否安装成功,安装的编译器的文件名是arm-linux-gcc.
注: 原生gcc3.2及以上版本无法生成引导编译器,解决方式见后.

六, 链接库的设置
$ cd ${PRJROOT}/build-tools
$ tar xvzf glibc-2.2.3.tar.gz
$ tar xvzf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3
$ cd build-glibc
$ CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include
$ make
$ make cross-compiling=yes install_root=${TARGET_PREFIX} prefix="" install
make时产生错误,install时产生两个error,解决方式见后.

$ cd ${TARGET_PREFIX}/lib
#备份libc.so文件
$ cp ./libc.so ./libc.so.orig
修改libc.so文件,将里面的绝对路径去掉,如: /lib/libc.so.6 --> libc.so.6

七, 完整编译器的设置
$ cd ${PRJROOT}/build-tools/build-gcc
$ ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --enable-languages=c,c++
$ make all
$ make install

八, 完成工具链的设置
$ cd ${PREFIX}/${TARGET}/bin
$ file as ar gcc ld nm ranlib strip
$ arm-linux-gcc -print-search-dirs
显示的信息:
install: /home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/
programs: /home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/:/usr/lib/gcc/arm-linux/2.95.3/:/usr/lib/gcc/arm-linux/:/home/tim/control-project/daq-module/tools/arm-linux/bin/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/arm-linux/bin/
libraries: /home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/:/usr/lib/gcc/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/arm-linux/lib/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/arm-linux/lib/

programs那一行的第一个条目就是${PREFIX}/lib/gcc-lib/arm-linux/2.95.3,此目录包含了gcc的链接库与工具程序.把二进制文件移往此目录,则交叉编译器就会使用它们,而不会使用原生的工具.

$ mv as ar gcc ld nm ranlib strip ${PREFIX}/lib/gcc-lib/arm-linux/2.95.3
$ for file in as ar gcc ld nm ranlib strip
> do
> ln -s ${PREFIX}/lib/gcc-lib/arm-linux/2.95.3/$file .
> done

我遇到的问题

Q:glibc编译错误如下:
error: `BUS_ISA' undeclared
A:参照http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
kernel-2.4.23以上的核心用CTL_BUS_ISA代替BUS_ISA
$ cp ${PRJROOT}/build-tools/glibc-2.2.3/sysdeps/unix/sysv/linux/arm/ioperm.c ${PRJROOT}/build-tools/glibc-2.2.3/sysdeps/unix/sysv/linux/arm/ioperm.c.orig
修改glibc源代码下的文件sysdeps/unix/sysv/linux/arm/ioperm.c
用CTL_BUS_ISA替换BUS_ISA

Q:glibc编译错误如下:
make -C manual subdir_install
make[2]: Entering directory `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3/manual'
LANGUAGE=C LC_ALL=C makeinfo libc.texinfo
./stdio.texi:3269: First argument to cross-reference may not be empty.
./stdio.texi:3270: First argument to cross-reference may not be empty.
makeinfo: Removing output file `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3/manual/libc.info' due to errors; use --force to preserve.
make[2]: *** [libc.info] Error 2
make[2]: Leaving directory `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3/manual'
make[1]: *** [manual/subdir_install] Error 2
make[1]: Leaving directory `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3'
make: *** [install] Error 2
A: 参考http://www.ctag.cn/blog/?q=node/22
修改stdio.texi文件之前作一下备份
$ cd ${PRJROOT}/build-tools/glibc-2.2.3/manual
$ cp stdio.texi stdio.texi.orig
Seems like I found the bug...
in libc's stdio.texi lines 2491 and 2492 the combination @ref{, is not allowed, I changed this to a valid first argument... seems like gcc has now started compiling, that probably means that libc was sucessful :-) *crossing fingers*
Sure.... But as I stated, this is not a "fix", it's a "hack" to make it work. I'ts in the documentation, and I think there is a very small chance anybody will look at that.
Untar the glibc-packet, patch it and re-tar before doing a "make".

diff -ur glibc-2.1.3 glibc-2.1.3.new/
diff -ur glibc-2.1.3/manual/stdio.texi glibc-2.1.3.new/manual/stdio.texi
--- glibc-2.1.3/manual/stdio.texi Wed Feb 23 08:02:56 2000
+++ glibc-2.1.3.new/manual/stdio.texi Sun Oct 6 14:46:39 2002
@@ -2487,8 +2487,10 @@
If you are trying to read input that doesn't match a single, fixed
pattern, you may be better off using a tool such as Flex to generate a
lexical scanner, or Bison to generate a parser, rather than using
-@code{scanf}. For more information about these tools, see @ref{, , ,
-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , ,
+@code{scanf}. For more information about these tools, see @ref{Low-Level
+I/O, , ,
+flex.info, Flex: The Lexical Scanner Generator}, and @ref{Low-Level I/O, ,
+,
bison.info, The Bison Reference Manual}.

Q: 编译无法进行,无法生成arm-linux-gcc.
A:使用gcc 3.2及以上的版本
$ cd ${PRJROOT}/build-tools
$ tar xvzf glibc-2.2.3.tar.gz
$ tar xvzf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3
$ mkdir build-glibc-headers
$ cd build-glibc-headers
$ ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include
$ make cross-compiling=yes install_root=${TARGET_PREFIX} prefix="" install-headers

产生一个假的stubs.h文件:
$ mkdir -p ${TARGET_PREFIX}/include/gnu
$ touch ${TARGET_PREFIX}/include/gnu/stubs.h

接下来建立引导gcc编译器:
$ cd ${PRJROOT}/build-tools
$ tar xvzf gcc-2.95.3.tar.gz
产生gcc-2.95.3目录
$ cd build-boot-gcc
$ ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --disable-shared --with-headers=${TARGET_PREFIX}/include --with-newlib --enable-languages=c
$ make all-gcc
$ make install-gcc

Q: 提示缺少features.h文件.
A: 拷贝一个过去:
$ cp ${PRJROOT}/build-tools/glibc-2.2.3/include/features.h ${TARGET_PREFIX}/include

Q: 交叉编译程序出错
/lib/libc.so.6: In function `pthread_attr_init@@GLIBC_2.1':
/lib/libc.so.6(.text+0xda5f0): multiple definition of `pthread_attr_init@@GLIBC_2.1'
/home/tim/control-project/daq-module/tools/arm-linux/lib/libpthread.so(.text+0xac): first defined here
/lib/libc.so.6: In function `pthread_cond_broadcast@@GLIBC_2.3.2':
......
/home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/ld: cannot find /lib/libc_nonshared.a
......
A: 忘记修改libc.so文件 :( 怎么修改? 老大, 看看上面,对了,说一下,每次重新编译glibc并安装后,都要修改这个文件.

有的时候需要修改specs文件:
$ cd $PREFIX/lib/gcc-lib/arm-linux/2.95.3
$ emacs specs
将20行的/lib/ld-linux.so.2
修改为 {TARGET_PREFIX}/lib/ld-linux.so.2 (结合使用的系统,将环境变量换成真实路径)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值