ubuntu12.04下安装编译BusyBox图文解说

ubuntu12.04下安装编译BusyBox图文解说


转载:http://blog.csdn.net/vigour1000/article/details/23543379



下载并解压

1、下载busybox源码包,可以从http://www.busybox.net/downloads/网站下载,这里我使用的是busybox-1.7.0.tar.bz2版本,本版点此下载

2、新建一个文件夹,命名为busybox(路径依自己而定,不过要记住此路径,下面会用到),并将下载的源码包存放在此目录下,如下

3、执行命令:tar -jxvf busybox-1.7.0.tar.bz2解压缩

解压缩后的文件夹

配置

4、执行命令:cd busybox-1.20.2 进入解压后的文件夹

此时你可以在此文件夹下看到解压后的文件

5、执行命令:make menuconfig ,出现配置界面

注意,很可能会出现 fatal error: curses.h: No such file or directory

compilation terminated.这样的错误,原因是没有安装ncurses库,使用以下命令即可安装:sudo apt-get install libncurses5-dev libncursesw5-dev

6、在这里先使用默认的配置,选择< Exit>,按回车键退出,会提示你是否保存

选择<Yes>

要注意的有一点,咱们这里的默认配置中使用的是动态连接,在构造根文件系统时需要在/lib目录下放置glibc库文件。不要感觉很麻烦,先这样设置就行。我也是看着韦老师的书弄的,后面还有。

编译

7、执行命令:vim Makefile 修改根目录下的Makefile,使用交叉编译器

这里只需要修改下图175和176这两行内容,不同的版本它们的所在行可能不一样。

修改后的这两行为下图

8、执行命令:make 编译BusyBox

我里个去,竟然有错误,提示以下错误

/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin/../arm-none-linux-gnueabi//sys-root/usr/include/linux/netfilter.h:55: error: field 'in' has incomplete type
/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin/../arm-none-linux-gnueabi//sys-root/usr/include/linux/netfilter.h:56: error: field 'in6' has incomplete type
ipsvd/tcpudp.c: In function 'tcpudpsvd_main':
ipsvd/tcpudp.c:314: warning: ignoring return value of 'write', declared with attribute warn_unused_result
make[1]: *** [ipsvd/tcpudp.o] 错误 1
make: *** [ipsvd] 错误 2

 

不着急,原因就是在/Your Arm-linux-gccDirectory/../arm-none-linux-gnueabi//sys-root/usr/include/linux/netfilter.h这个头文件里少加入#include<netinet/in.h> 这一句就可以了

再次make,又有如下错误,闹心

networking/libiproute/lib.a(iptunnel.o): In function `print_tunnel':
iptunnel.c:(.text.print_tunnel+0x1ec): undefined reference to `__cpu_to_be16'
iptunnel.c:(.text.print_tunnel+0x200): undefined reference to `__cpu_to_be16'
iptunnel.c:(.text.print_tunnel+0x238): undefined reference to `__cpu_to_be16'
iptunnel.c:(.text.print_tunnel+0x24c): undefined reference to `__cpu_to_be16'
iptunnel.c:(.text.print_tunnel+0x26c): undefined reference to `__cpu_to_be16'
networking/libiproute/lib.a(iptunnel.o):iptunnel.c:(.text.print_tunnel+0x290): more undefined references to `__cpu_to_be16' follow
collect2: ld returned 1 exit status
make: *** [busybox_unstripped] 错误 1

解决方法就是在该目录下的vim networking/libiproute/iptunnel.c 文件中加入#include <asm/byteorder.h>

先执行一次make clean命令,再执行make命令,好家伙,终于没错误了。如下

安装

9、执行命令:make CONFIG_PREFIX=/YourPath install,这里YourPath是你的要将BusyBox安装的位置。我将它安装在了/home/song/nfs_root/fs_mini下,如下

make CONFIG_PREFIX=/home/song/nfs_root/fs_mini install

一切完成后,将在/home/song/nfs_root/fs_mini/目录下生成如下文件

其中linuxrc和/sbin/init的功能完全一样;其他目录下是各种命令,不过它们都是到/bin/busybox的符号连接,比如 /home/song/nfs_root/fs_mini/sbin目录下:

除 bin/busybox 外,其他文件都是到bin/busybox的符号连接。busybox是所有命令的集合体,这些符号连接文件可以直接运行。比如在开发板上,运行“ls”命令和“busybox ls”命令是一样的。

到这里busybox已经安装成功了


构建根文件系统二之安装使用glibc库

 在我们制作交叉编译工具链arm-linux-gcc时,已经生成了glibc库,可以直接使用它来构建根文件系统,本文使用的时光盘里自带的压缩库,由下图可以看出,这是arm-linux-gcc3.4.5版本的glibc库,而我的arm-linux-gcc是4.4.3的,可不可以使用呢?可以的啊!glibc库点此下载

   

1、执行命令:tar -jxvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 解压

   

  可以看到解压到了gcc-3.4.5-glibc-2.3.6文件夹,而我们需要的glibc库的位置存放在gcc-3.4.5-glibc-2.3.6/arm-linux/lib 文件夹下

2、执行命令:ls gcc-3.4.5-glibc-2.3.6/arm-linux/lib 可以看到该目录下的文件。其实这个目录下的文件并非都属于glibc库,比如crt1.o、libstdc++.a等文件是gcc工具本身生成的。里面的目录、文件可以分为8类。

    ①  加载器ld-2.3.6.so、ld-linux.so.2。

    动态程序启动前,它们都被用来加载动态库。

    ②  目标文件(.o)。

    比如crt1.o、crti.o、crtn.o、Mctr1.o、Scrt1.o等,在生成应用程序时,这些文件像一般的目标文件一样被链接。

    ③  静态库文件(.a)。

    比如静态数学库libm.a、静态c++库libstdc++.a等,编译静态程序时会连接它们

    ④  动态库文件(.so、,so.[0-9]*)。

    比如动态数学库libm.so、动态c++库libstdc++.so等,它们可能是一个链接文件。编译动态库时会用到这些文件,但是不会连接它们,运行时才连接。

    ⑤  libtool库文件(.la)。

    在连接库文件时,这些文件会被用到,比如它们列出了当前库文件所依赖的其他库文件。程序运行时无需这些文件。

    ⑥  gconv目录。

    里面是有头字符的集的动态库,比如ISO8859-1.so、GB18010.so等。

    ⑦  ldscripts目录。

   里面是各种连接脚本,在编译应用程序时,它们被用于制定程序的运行地址、各段的位置等。

    ⑧  其他目录及文件。

3、废话那么多,现在安装glibc库,在上一节我们编译安装busybox时使用的是动态连接,这里在开发板上只需要加载器和动态库,假设要创建的根文件系统目录为/home/song/nfs_root/fs_mini,操作如下:

   执行命令:mkdir -p /home/song/nfs_root/fs_mini/lib 

   执行命令:cp /YourPath/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/*.so*  /YourPath/nfs_root/fs_mini/lib/   

   

至此,glibc库已经安装完成。其实,上面复制的库文件不是每个文件都会被用到,可以根据应用程序对库的依赖关系保留需要用到的。通过ldd命令可以查看一个应用程序会用到哪些库。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值