免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4248 | 回复: 4
打印 上一主题 下一主题

我也来做嵌入式 linux(连载一) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-09 15:31 |只看该作者 |倒序浏览
前言
前些阵子做了一个在U盘上跑的,但是没有做笔记,稀里糊涂地做完了,这阵子得了一本《构建嵌入式Linux系统》,打算重新照着再做一遍,把笔记贴上来,也不敢保证一定做得出来,做到哪一步算哪一步吧!

-----------------------------------------------------------------------------------
制作嵌入式linux
kendo (C) copyleft
2005-10-09


目的:构建一个X86平台的小型Linux系统,存储设备选择硬盘或CF卡;

第一章 准备工作
1、主机平台
Redhat 9.0 +原生GNU工具链

2、开发目录
control-project
     control-module
     daq-module
         bootloader
         build-tools
         debug
         doc
         images
         kernel
         rootfs
         sysapps
         tmp
         tools
     sysmgnt-module
     user-interface

目录说明
目录        内容
bootloader        目标板的引导加载程序,如lilo等
build-tools        建立交叉编译平台的工具源码
debug        调试工具及所有相关包
doc        项目中用到的所有文档
images        编译好的内核映像,以及根文件系统
kernel        各个版本的Linux内核源码
rootfs        制作好的根文件系统
sysapps        目标板将要用到的系统应用系统,比如thttpd,udhcpd等
tmp        存放临时文件
tools        编译好的跨平台开发工具链以及C链接库

按照上面所示目录树,在本机创建相应目录
_____________________________________________________

第二章 建立交叉编译平台
准备工作
所需软件
Linux-2.4.18
binutils-2.10.1
gcc-2.95.3
uClibc-0.9.16
将这些软件存放入对应的工作目录中;

1、        设置工作空间
根据工作空间的实际情况,建立脚本develdaq
export PROJECT=daq-module
export PRJROOT=/home/kendo/control-project/${PROJECT}
export TARGET=i386-linux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=${PREFIX}/bin{PATH}
export PATH=${PREFIX}/BIN{PREFIX}/uclibc/bin{PATH}

cd $PRJROOT

2、        准备安装build-tools
建立目录
. develdaq
cd ${PRJROOT}/build-tools
mkdir build-binutils build-boot-gcc build-gcc build-uclibc
这四个目录分别对应二进制工具程序、引导编译器、完整编译器、C链接库

内核头文件的设置
将准备好的内核源码放入${PRJROOT}/kernel,解压
tar xvzf linux-2.4.18.tar.gz

将解压后生成的目录改名为linux-2.4.18,这样方便多个版本共存,编译之
cd linux-2.4.18
make ARCH=i386 CROSS_COMPILE=i386-linux- menuconfig
其中ARCH CROSS_COMPILE对应的目标板的平台。
选针对实际情况随便选选

建立交叉工具链所需要的include目录,并将内核头文件复制过去:
mkdir –p ${TARGET_PREFIX}/include
[root@skynet linux-2.4.18]# cp -r include/linux/ ${TARGET_PREFIX}/include
[root@skynet linux-2.4.18]# cp -r include/asm-i386/ ${TARGET_PREFIX}/include/asm
[root@skynet linux-2.4.18]# cp -r include/asm-generic/ ${TARGET_PREFIX}/include

3、        安装binutils
取出源码:
[root@skynet linux-2.4.18]# cd ${PRJROOT}/build-tools
tar zxvf binutils-2.10.1.tar.gz

进入为binutils建立的目录,配置:
# cd build-binutils/
# ../binutils-2.10.1/configure --target=$TARGET --prefix=${PREFIX}
target为目标板类型,prfix为安装目录
#make
一切顺利……继续安装
#make install
这样,binutils被安装至指定的PREFIX中,看一看先:
[root@skynet binutils-2.10.1]# ls -l ${PREFIX}/bin
total 18320
-rwxr-xr-x    1 root     root      1375636 Oct  9 12:31 i386-linux-addr2line
-rwxr-xr-x    2 root     root      1387052 Oct  9 12:31 i386-linux-ar
-rwxr-xr-x    2 root     root      2459611 Oct  9 12:32 i386-linux-as
-rwxr-xr-x    1 root     root       122899 Oct  9 12:31 i386-linux-c++filt
-rwxr-xr-x    1 root     root       175697 Oct  9 12:32 i386-linux-gasp
-rwxr-xr-x    2 root     root      1952165 Oct  9 12:32 i386-linux-ld
-rwxr-xr-x    2 root     root      1393750 Oct  9 12:31 i386-linux-nm
-rwxr-xr-x    1 root     root      1829174 Oct  9 12:31 i386-linux-objcopy
-rwxr-xr-x    1 root     root      1948079 Oct  9 12:31 i386-linux-objdump
-rwxr-xr-x    2 root     root      1387047 Oct  9 12:31 i386-linux-ranlib
-rwxr-xr-x    1 root     root       240373 Oct  9 12:31 i386-linux-readelf
-rwxr-xr-x    1 root     root      1299977 Oct  9 12:31 i386-linux-size
-rwxr-xr-x    1 root     root      1276928 Oct  9 12:31 i386-linux-strings
-rwxr-xr-x    2 root     root      1829169 Oct  9 12:31 i386-linux-strip

每个工具加了刚才指定的前缀i386-linux-

4、安装GCC
gcc 要麻烦点,需要先建立一个引导编译器,只支持C语言,等链接库建立好后,才能安装完速的支持C++的……
取出源码:
#cd ..
#tar zxvf gcc-2.95.3.tar.gz

配置:
[root@skynet build-tools]# cd build-boot-gcc/
[root@skynet build-boot-gcc]# ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --without-headers --with-newlib --enable-languages=C
注:--without-header,因为是交叉编译,并不需要目标板的系统头文件;
--with-newlib,告诉配置工具,不需要使用glibc
--enable-languages=C,告诉编译器,支持哪种语言

编译:
make all-gcc
还是很顺利,没有报错,安装:
make install-gcc

5、        安装C链接库uClibc
解压:
#cd ..
#tar jvxf uClibc-0.9.16.tar.bz2

配置:
进入 源码目录
# cd uClibc-0.9.16
# make CROSS=i386-linux- menuconfig

根据实际需要,选择相应的项,也可以采用默认值,对于交叉编译来说,我改变了以下三项设置:
Linux kernel header location                                        ${PRJROOT}/kernel/linux-2.4.18
Shared library loader path                                        /lib
uClibc development environment directory                 ${PRJROOT}/tools/uclibc

编译:
#make CROSS=i386-linux-

安装:
#make CROSS=i386-linux- PREFIX=”” install

# ls /home/kendo/control-project/daq-module/tools/uclibc/
bin  include  lib  usr
其中,bin目录下边,就是uclibc对应的二进制工具了

6 、安装完整的编译器
第一遍安装gcc时,因为那个时候链接库还没有安装,所以使用了—without选项,现在uClibc安装完成了,利用它的include 和lib,安装完整的编译器,使之支持C++:
[root@skynet daq-module]# cd build-tools/
[root@skynet build-tools]# cd build-gcc/
[root@skynet build-gcc]# ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --with-headers=${PRJROOT}/tools/uclibc/include --with-libs=${PRJROOT}/tools/uclibc/lib --enable-languages=C,C++

编译这个要好办天,上QQ打了一会儿俄罗斯方块……
回过头来,顺利编译完成,安装:
make install

收工

7、        检测工具链
花了四五十分钟时间,总算把整个交叉编译工具链搭建好了,检测一下先,
#cd ${PRJROOT}/tools
# ls -l
total 32
bin                                交叉开发工具
i386-linux                目标板专用文件
include                        供交叉开发工具使用的头文件
info                                gcc 的info文件
lib                                供交叉开发工具使用的库文件
man                                交叉开发工具在线说明文件
share                        交叉开发工具与链接库共享的文件
uclibc                        uclibc的二进制工具程序、库文件、头文件等

因为没有使用glibc,而使用了uclibc代替之,所以inclue、lib这些目录基本上没有多少内容,实际使用的include、lib文件都在uclibc对应的子目录下边;

8、        使用工具链
工具链做好了,能不能交叉编译,大家可以写个小程序测试一下,编译程序不再是gcc,而是${PRJROOT}/toos/uclibc/bin/ i386-uclibc-gcc,如果觉得每次输入这么长个路径麻烦,可以把它写到PATH中,如我在起先建立的脚本develdap中增加如下语句:
export PATH=${PREFIX}/bin{PREFIX}/uclibc/bin{PATH}

明天再接着编译内核吧……^o^

论坛徽章:
0
2 [报告]
发表于 2005-10-09 16:05 |只看该作者

我也来做嵌入式 linux(连载一)

顶,关注。。。

论坛徽章:
0
3 [报告]
发表于 2005-10-09 17:17 |只看该作者

我也来做嵌入式 linux(连载一)

好才测试了一下,把以前的程序中makefile中编译器名称改一下,其它地方根据实际情况,稍做修改,就OK了……试着编译thttpd,udhcpd这些也没有问题了

论坛徽章:
0
4 [报告]
发表于 2006-09-21 09:22 |只看该作者

学习


/

论坛徽章:
0
5 [报告]
发表于 2006-09-21 10:56 |只看该作者

回复 1楼 独孤九贱 的帖子

LZ 你是按照《构建嵌入式Linux系统》来制作交叉工具链吗?
我照那本书的介绍作了好多次MIPS下的交叉工具链,都没有成功过,我们这边的人也没有成功过,不知道是不是我们这边人下的文件的版本号不对还是怎么的。
不过祝LZ好运,做出来了通知一声啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP