linux 编译busybox出现的一些问题

来源:互联网 发布:普朗克长度 知乎 编辑:程序博客网 时间:2024/05/17 04:55

原文地址:http://blog.csdn.net/leon1741/article/details/54838924

今天研究了一下busybox的编译。自己下了一个busybox-1.25.0的版本(直接从busybox官网上下载:https://busybox.net/downloads/),进行编译,遇到了一些问题,通过百度搜索和自己摸索,也成功解决了,详细记录如下:

首先交代一下系统版本和开发环境:

  • 操作系统:ubuntu 12.04(64bit)
  • 交叉编译工具链:arm-linux-gcc 4.4.3
  • busybox源码包:busybox-1.25.0

一、修改Makefile配置

首先解压源码包:

tar -jxvf busybox-1.25.0.tar.bz2
  • 1

进入busybox-1.25.0目录,修改Makefile文件如下:

ARCH ?= armCROSS_COMPILE ?= arm-linux-
  • 1
  • 2

二、修改配置文件

make menuconfig
  • 1

选择Busybox Settings—>Build Options—>,选择[*] Build Busybox as a static binary(no shared libs);

三、编译源码,解决问题

make cleanmake
  • 1
  • 2

出现如下错误:

miscutils/nandwrite.c: In function 'nandwrite_main':miscutils/nandwrite.c:151: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)miscutils/nandwrite.c:151: error: (Each undeclared identifier is reported only oncemiscutils/nandwrite.c:151: error: for each function it appears in.)scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failedmake[1]: *** [miscutils/nandwrite.o] Error 1Makefile:742: recipe for target 'miscutils' failedmake: *** [miscutils] Error 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

解决办法:

MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义,于是将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中,然后在nandwrite.c文件中包含该头文件:

gedit miscutils/nandwrite.c 
  • 1

修改

#include "libbb.h"#include <mtd/mtd-user.h>
  • 1
  • 2

#include "libbb.h"#include "mtd-abi.h"#include <mtd/mtd-user.h>
  • 1
  • 2
  • 3

此问题解决。继续make,又出现如下错误:

util-linux/blkdiscard.c: In function 'blkdiscard_main':util-linux/blkdiscard.c:72: error: 'BLKSECDISCARD' undeclared (first use in this function)util-linux/blkdiscard.c:72: error: (Each undeclared identifier is reported only onceutil-linux/blkdiscard.c:72: error: for each function it appears in.)scripts/Makefile.build:197: recipe for target 'util-linux/blkdiscard.o' failedmake[1]: *** [util-linux/blkdiscard.o] Error 1Makefile:742: recipe for target 'util-linux' failedmake: *** [util-linux] Error 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

解决办法:

BLKSECDISCARD在/usr/include/linux/fs.h中定义,同上理,直接将/usr/include/linux/fs.h拷贝到busybox的include文件中,不过这次还要额外修改一下文件中的部分内容,否则会出现编译失败。

1、屏蔽以下4个头文件(否则编译时会提示找不到头文件):

//#include <linux/limits.h>//#include <linux/ioctl.h>//#include <linux/blk_types.h>//#include <linux/types.h>
  • 1
  • 2
  • 3
  • 4

2、屏蔽以下几个结构体(否则编译时会提示找不到类型定义):

#if 0struct fstrim_range {    __u64 start;    __u64 len;    __u64 minlen;};/* And dynamically-tunable limits and defaults: */struct files_stat_struct {    unsigned long nr_files;     /* read only */    unsigned long nr_free_files;    /* read only */    unsigned long max_files;        /* tunable */};struct inodes_stat_t {    int nr_inodes;    int nr_unused;    int dummy[5];       /* padding for sysctl ABI compatibility */};#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

然后修改blkdiscard.c中对fs.h头文件的包含方式:

gedit util-linux/blkdiscard.c
  • 1

修改

#include <linux/fs.h>
  • 1

#include "fs.h"
  • 1

继续make,编译能通过了。但是在链接的时候出现问题:

networking/lib.a(nslookup.o): In function `print_host':nslookup.c:(.text.print_host+0x44): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingdebianutils/lib.a(mktemp.o): In function `mktemp_main':mktemp.c:(.text.mktemp_main+0x98): warning: the use of `mktemp' is dangerous, better use `mkstemp'networking/lib.a(ipcalc.o): In function `ipcalc_main':ipcalc.c:(.text.ipcalc_main+0x25c): warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkinglibbb/lib.a(inet_common.o): In function `INET_resolve':inet_common.c:(.text.INET_resolve+0x60): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingnetworking/lib.a(inetd.o): In function `reread_config_file':inetd.c:(.text.reread_config_file+0x230): warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingnetworking/lib.a(netstat.o): In function `ip_port_str':netstat.c:(.text.ip_port_str+0x50): warning: Using 'getservbyport' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingutil-linux/lib.a(nsenter.o): In function `nsenter_main':nsenter.c:(.text.nsenter_main+0x1b0): undefined reference to `setns'collect2: ld returned 1 exit statusNote: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS.Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam"Makefile:717: recipe for target 'busybox_unstripped' failedmake: *** [busybox_unstripped] Error 1 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

解决办法:

make menuconfig
  • 1

Linux System Utilities—>nsenter,去掉该选项,重新编译make,又出现如下错误:

networking/lib.a(nslookup.o): In function `print_host':nslookup.c:(.text.print_host+0x44): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingdebianutils/lib.a(mktemp.o): In function `mktemp_main':mktemp.c:(.text.mktemp_main+0x98): warning: the use of `mktemp' is dangerous, better use `mkstemp'networking/lib.a(ipcalc.o): In function `ipcalc_main':ipcalc.c:(.text.ipcalc_main+0x25c): warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkinglibbb/lib.a(inet_common.o): In function `INET_resolve':inet_common.c:(.text.INET_resolve+0x60): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingnetworking/lib.a(inetd.o): In function `reread_config_file':inetd.c:(.text.reread_config_file+0x230): warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingnetworking/lib.a(netstat.o): In function `ip_port_str':netstat.c:(.text.ip_port_str+0x50): warning: Using 'getservbyport' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingcoreutils/lib.a(sync.o): In function `sync_main':sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs'collect2: ld returned 1 exit statusNote: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS.Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam"Makefile:717: recipe for target 'busybox_unstripped' failedmake: *** [busybox_unstripped] Error 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

解决办法:

make menuconfig
  • 1

Coreutils—>sync选项去掉,重新make编译通过,终于顺利生成了busybox可执行文件。

OK,今天到此为止,明天再继续研究。

搞定,收工!


篇后语:

1、编译完后对上述几个问题进行反思,发现这几个问题其实来讲可以分为2类。一类是头文件包含的问题,一类是make menuconfig配置的问题。后者,可能跟每个人的配置需求有关。但是前者的问题,我认为busybox公司完全可以将那2个头文件直接包含在源码包中,将相关代码修改成OK的状态,让我们下载过来就可以直接编译通过,免去我们这番折腾。但是为何busybox公司没有这么做呢?其中应该是有原因的,暂时想不通,待日后再仔细琢磨吧。

2、本文撰写时,使用的busybox工具源码版本是busybox-1.25.0,使用上述方法验证通过。不过,紧接着,我又验证了最新的busybox-1.26.2版本,同样使用上述方法,顺利通过,编译成功。证明本文中的方法应该对于各个版本都是通用的。

3、本文只是简单的介绍了一下使用busybox过程中遇到几个编译出错的问题的解决办法,并未对整套编译流程进行详细介绍。关于如何利用busybox工具编译出linux根文件系统的完整流程,可参见我的另外一篇博客(如何使用busybox编译和生成最简linux根文件系统(rootfs))。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宾格手表是哪里产的 you的宾格 our的宾格 your的宾格 什么是宾格 宾格机械表 binger手表 英语主格宾格表 binger1853手表多少钱 宾格犬 英语宾格 binger 她的宾格 宾格国产手表 binge binger手表1853价格 宾格表 瑞士宾格手表怎么样 binger是什么牌子手表 男士手表图片及价格 宾格形式 宾格犬图片 逍遥宾王 宾王 宾王沈浪 宾王扑克 宾王市场 义乌宾王服装批发市场 逍遥宾王洛天全文阅读 义乌宾王市场 宾礼 九宾之礼 宾虚 犹大宾虚 宾补 主谓宾宾补 宾补是什么 英语主谓宾定状补详解 英语主谓宾定状补图解 主谓宾定状补位置图解 语文主谓宾定状补