2011-01-20

Embedded Linux from Scratch on VMWare: (3) 反思\过程改进

前面build\安装busybox时, 我手工把busybox所需的动态库拷贝到target上. 这样很不好, 容易出错\遗漏

1: uclibc
=========

更合适的做法是: 自己build uclibc, 利用 uclibc 提供的 make install_runtime 将所需的运行时库安装到合适的地方

借用buildroot 的 uclibc 配置文件
v4@elws:~/toy$ tar xjvf buildroot-2010.11/dl/uClibc-0.9.31.tar.bz2
v4@elws:~/toy$ cd uClibc-0.9.31/
v4@elws:~/toy/uClibc-0.9.31$ cp ../buildroot-2010.11/toolchain/uClibc/uClibc-0.9.31.config ./.config
v4@elws:~/toy/uClibc-0.9.31$ make oldconfig
v4@elws:~/toy/uClibc-0.9.31$ make menuconfig
Library Installation Options 下面的几个路径已经是标准的了:
-> Library Installation Options
(/) uClibc runtime library directory
(/usr/) uClibc development environment directory
(lib) library path component
[*] Hardwire absolute paths into linker scripts
uClibc development/debugging options 下面定义交叉工具prefix, 这里通过CFLAGS给它指定sysroot:
-> uClibc development/debugging options
(/home/v4/toy/buildroot-2010.11/output/staging/usr/bin/i686-unknown-linux-uclibc-) Cross-compiling toolchain
(--sysroot=/home/v4/toy/buildroot-2010.11/output/staging/) Enter any extra CFLAGS to use to build uClibc
注意只需要安装运行时(runtime)库:
v4@elws:~/toy/uClibc-0.9.31$ make
(下面以root执行!)
elws:/home/v4/toy/uClibc-0.9.31# make PREFIX=/mnt/toy/ install_runtime
2: busybox
===========

busybox 默认安装到了源码目录下的_install, 但安装目录也可以指定:
elws:/home/v4/toy/busybox-1.18.1# make CONFIG_PREFIX=/mnt/toy/ install
3: rootfs
==========

将target磁盘mount到host, 软件直接安装到上面, 这样做没有问题, 如果可以做到的话, 还是最方便的做法. 但实际开发嵌入式系统时, 可能就没法将target存储设备(如flash)mount到host了, "专业"的做法是在host上制作rootfs, 然后将rootfs"烧录"到target

对我们的磁盘+ext3文件系统, 可以这样创建一个rootfs:
elws:/home/v4/toy# dd if=/dev/sdd1 of=./rootfs.ext3
elws:/home/v4/toy# mkdir rootfs
elws:/home/v4/toy# mount -o loop rootfs.ext3 rootfs/
接下来所有对rootfs/目录的修改都直接反应到了rootfs.ext3 image文件中. 弄好了将image写到磁盘中就是一个反向的过程:
elws:/home/v4/toy# dd if=./rootfs.ext3 of=/dev/sdd1
对flash+jffs2, 基本原理相同, 只是将在host上的dd过程, 改为在target上利用bootloader提供的image烧写, 或者处理器提供的其他方式(如: 通过usb启动\下载image)

4: cross toolchain
===================

buildroot 生成的toolchain(output/staging)已经包含了uclibc C开发库\头文件\linux头文件, 是一个完整的c交叉编译开发环境. 但是, 开发一个应用时, 除了c以外, 还需要依赖另外一个库, 我们可以把这个库安装到target上, 或者安装在toolchain里面, 但是这样可能带来一个问题, 当我们需要重新build buildroot时, toolchain被覆盖了, 我们之前自己安装的库就丢失了

buildroot其实可以生成一个完整的<此处谬误!---->chroot环境, 包含了toolchain以外, 还有shell(busybox)\make\.... <----!!!>但是, 我认为buildroot不够稳健, 所以尽量少地依赖它. 但是, 我们可以在buildroot生成的toolchain基础之上(逐渐)增加自己的开发库\头文件. shell\make 等工具, 可以利用host上的, 不是一定必要在chroot环境下进行交叉编译

先把buildroot的toolchain拷贝出来, 重命名为toolchain
v4@elws:~/toy$ cp -fr buildroot-2010.11/output/staging ./toolchain
参照上面uclibc的部分, 在toolchain内重新安装uclibc, 但是需要修改一下交叉工具的路径为我们自己的toolchain
v4@elws:~/toy$ cd uClibc-0.9.31/
v4@elws:~/toy/uClibc-0.9.31$ make menuconfig
-> uClibc development/debugging options
-> Cross-compiling toolchain prefix
修改为: /home/v4/toy/toolchain/usr/bin/i686-unknown-linux-uclibc-
-> Enter any extra CFLAGS to use to build uClibc
修改为: --sysroot=/home/v4/toy/toolchain/
v4@elws:~/toy/uClibc-0.9.31$ make
v4@elws:~/toy/uClibc-0.9.31$ make PREFIX=$HOME/toy/toolchain/ install
将kernel 头文件也重新安装一下(无害)
v4@elws:~/toy/uClibc-0.9.31$ cd ../linux-2.6.36.1/
v4@elws:~/toy/linux-2.6.36.1$ make ARCH=x86 CROSS_COMPILE=$HOME/toy/toolchain/usr/bin/i686-linux-
v4@elws:~/toy/linux-2.6.36.1$ make INSTALL_HDR_PATH=$HOME/toy/toolchain/usr headers_install

No comments:

Post a Comment