今天研究了一下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

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

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-

二、修改配置文件

make menuconfig

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

三、编译源码,解决问题

make clean
make

出现如下错误:

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 once
miscutils/nandwrite.c:151: error: for each function it appears in.)
scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failed
make[1]: *** [miscutils/nandwrite.o] Error 1
Makefile:742: recipe for target 'miscutils' failed
make: *** [miscutils] Error 2

解决办法:

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

gedit miscutils/nandwrite.c 

修改

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

#include "libbb.h"
#include "mtd-abi.h"
#include <mtd/mtd-user.h>

此问题解决。继续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 once
util-linux/blkdiscard.c:72: error: for each function it appears in.)
scripts/Makefile.build:197: recipe for target 'util-linux/blkdiscard.o' failed
make[1]: *** [util-linux/blkdiscard.o] Error 1
Makefile:742: recipe for target 'util-linux' failed
make: *** [util-linux] Error 2

解决办法:

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>

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

#if 0
struct 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

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

gedit util-linux/blkdiscard.c

修改

#include <linux/fs.h>

#include "fs.h"

继续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 linking
debianutils/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 linking
libbb/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 linking
networking/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 linking
networking/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 linking
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x1b0): undefined reference to `setns'
collect2: ld returned 1 exit status
Note: 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' failed
make: *** [busybox_unstripped] Error 1 

解决办法:

make menuconfig

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 linking
debianutils/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 linking
libbb/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 linking
networking/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 linking
networking/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 linking
coreutils/lib.a(sync.o): In function `sync_main':
sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs'
collect2: ld returned 1 exit status
Note: 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' failed
make: *** [busybox_unstripped] Error 1

解决办法:

make menuconfig

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))。

64位ubuntu 12.04系统编译busybox遇到的问题处理办法相关推荐

  1. 64位Ubuntu 12.04系统下安装Qt library和Qt Creator全过程记录

    最新公司搞一个新项目,需要在linux下进行UI界面设计.选来选去,最后选择采用Qt平台来做,于是要开始研究一下Qt. Qt作为跨平台的C++图形用户界面库,可以说是功能强大.应用广泛.相关的教程和资 ...

  2. 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

    最新公司搞一个新项目,需要在Linux下进行UI界面设计.选来选去,最后选择采用Qt平台来做,于是要开始研究一下Qt. Qt作为业内最著名的UI开发工具之一,是一套完整的跨平台C++图形用户界面应用程 ...

  3. 64位ubuntu 12.04编译linux内核提示mkimage command not found

    今天心血来潮,想编译以下linux内核来玩玩.一开始编译x86的版本,遇到了openssl/opensslv.h文件缺失的问题,经过一番折腾,顺利解决(解决过程请参见我的另外一篇博客"lin ...

  4. 在64位Ubuntu 16.04系统里安装Qt 5.9.1

    从网上下载Linux系统的64位Qt 5.9.1,下载的安装文件是   qt-opendource-linux-x64-5.9.1.run 打开命令终端,直接运行这个安装文件可能提示没有权限,因为下载 ...

  5. 64位ubuntu 12.04编译linux内核提示openssl/opensslv.h文件缺失

    今天心血来潮,想编译一下linux内核来玩玩.从git上下载了最新版本的源码,放在我的ubuntu系统下,首先从现有ubuntu系统的boot目录下,拷贝了config-3.13.0-32-gener ...

  6. 64位ubuntu 12.04下如何解决中文乱码的问题

    一.Ubuntu默认的中文字符编码 Ubuntu默认的中文字符编码为zh_CN.UTF-8, 这个可以在/etc/environment中看到: sudo gedit /etc/environment ...

  7. linux系统嵌入式编译环境,64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解...

    64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛. 安装步骤 1.准备工具安装目录 将压缩包ar ...

  8. 在32位Ubuntu 10.04上编译Android 2.3

    在32位Ubuntu 10.04上编译Android 2.3 http://www.ylmf.net/ubuntu/tips/2011021722700.html 本人在Ubuntu 10.04系统 ...

  9. Ubuntu 12.04 下编译Android 4.0.3

    在Ubuntu 12.04 下编译了Android 4.0.3发现了一大堆错误,网上找了一堆的更改源码啊,Android.mk的解决方法,虽然可以编译成功,但都有点坑爹的成分,为了不误人子弟就分享出来 ...

最新文章

  1. bitset HDU6515 Coding Problem
  2. 通俗易懂!使用Excel和TF实现Transformer
  3. 900万张标注图像,谷歌发布Open Images最新V3版
  4. python【蓝桥杯vip练习题库】ALGO-90出现次数最多的整数(sys)
  5. 【Python】skimage模块
  6. linux:gpg加密和解密
  7. mysql数据库主要负责存储_MySQL默认数据库简介
  8. find VS not looking for VS2015
  9. python制作动图、怎么运行_漫画:如何分析运行中的 Python 程序?
  10. js延时函数_JS 函数的执行时机
  11. (原创)Windows系统后安装ubuntu,无法选择启动ubuntu。
  12. UG1969软件详细安装教程
  13. 社区团购微信小程序开发
  14. 人脸预处理:人脸检测+人脸对齐
  15. Cobar介绍及配置
  16. 题解 P1621 【集合】
  17. 微软输入法设置小鹤双拼
  18. JavaScript 实现微信公众号内分享功能
  19. 数据库内存故障恢复一例
  20. JS 数组删除 splice和delete

热门文章

  1. iOS框架介绍之coreImage
  2. java数组随机抽取分布均匀_java利用数组随机抽取幸运观众
  3. 【坚持】Selenium+Python学习记录 DAY10
  4. java生成excel文件
  5. .gitignore文件不起作用
  6. php接口数据加密、解密、验证签名【转】
  7. java 日期及别的小技巧
  8. 微信小程序下拉刷新/上拉加载更多
  9. 苹果显示已连接网络连接到服务器异常,苹果确认iphone密码,显示连接服务器出现问题,为什么...
  10. vb仿excel控件_如何通过INTOUCH组态软件做EXCEL报表(含代码)