使用BusyBox1.9.2制作根文件系统编译出错现象

本文详细介绍BusyBox静态编译的过程,包括下载源代码、配置交叉编译工具、修改Makefile、解决编译过程中的常见错误等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【具体步骤】:

     1)下载busybox源代码,并解包

     BusyBox官网 www.busybox.net/downloads 下载源码busybox-1.9.2

     $ tar jxvf busybox-1.9.2.tar.bz2 -C ./

     2)下载交叉编译工具,并安装

     我下载的是:arm-linux-4.4.3

     说明:要正确设置好PATH环境变量。

        加到PATH路径中。

     3)进入到busybox解压后的源文件目录中,修改Makefile

     ARCH ?= arm

     CROSS_COMPILE ?= arm-linux-

     4)进行编译选项配置

     a

     $ make menuconfig

     Busybox Settings --->

            Build Options --->

               [*] Build BusyBox as a static binary(no shared libs)

     说明:这个选项一定要选,这样才能把busybox编译成静态链接的可执行文件,运行时可以独立于其他库。

     b

            Installation Options --->

               [*] Don't use /usr

 

     说明:这个也一定要选,否则make install后,busybox将安装在原来系统的/usr下,将你原有的命令都覆盖了!

     5)配置好后可以编译了,执行如下命令:

     $ make

     发现没过多久,就报错了,晕,错误内容如下:

     applets/applets.c:20:2: warning: #warning Static linking against glibc produces buggy executables

    applets/applets.c:21:2: warning: #warning (glibc does not cope well with ld --gc-sections).

    applets/applets.c:22:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400

    applets/applets.c:23:2: warning: #warning Note that glibc is unsuitable for static linking anyway.

    applets/applets.c:24:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections

    applets/applets.c:25:2: warning: #warning from top-level Makefile and remove this warning.

    applets/applets.c:26:2: error: #error Aborting compilation.

    make[1]: *** [applets/applets.o] 错误1

    make: *** [applets] 错误2

     看到它给出了提示,说glibc库不适和用来静态编译,最后给出解决方案就是将applets/applets.c中这部分内容给去掉,也就是19-27行。

 

【具体步骤】:

     1)下载busybox源代码,并解包

     $ wget -chttp://www.busybox.net/downloads/busybox-1.7.0.tar.bz2

     $ tar jxvf busybox-1.7.0.tar.bz2

     2)下载交叉编译工具,并安装

     我下载的是:arm-2009q1-161-arm-none-eabi.bin

     说明:要正确设置好PATH变量。

     例如将你的目录”/CodeSourcery/Sourcery_G++_Lite/bin加到PATH路径中。

     3)进入到busybox解压后的源文件目录中,修改Makefile

     将第176行改为:

     CROSS_COMPILE  ?=arm-none-linux-gnueabi-

     4)进行编译选项配置

     a

     $ make menuconfig

     Busybox Settings --->

            Build Options --->

               [*] Build BusyBox as a static binary(no shared libs)

     说明:这个选项一定要选,这样才能把busybox编译成静态链接的可执行文件,运行时可以独立于其他库。

     b

            Installation Options --->

               [*] Don't use /usr

 

     说明:这个也一定要选,否则make install后,busybox将安装在原来系统的/usr下,将你原有的命令都覆盖了!

     5)配置好后可以编译了,执行如下命令:

     $ make

     发现没过多久,就报错了,晕,错误内容如下:

     applets/applets.c:20:2: warning: #warning Static linking against glibc produces buggy executables

    applets/applets.c:21:2: warning: #warning (glibc does not cope well with ld --gc-sections).

    applets/applets.c:22:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400

    applets/applets.c:23:2: warning: #warning Note that glibc is unsuitable for static linking anyway.

    applets/applets.c:24:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections

    applets/applets.c:25:2: warning: #warning from top-level Makefile and remove this warning.

    applets/applets.c:26:2: error: #error Aborting compilation.

    make[1]: *** [applets/applets.o] 错误1

    make: *** [applets] 错误2

     看到它给出了提示,说glibc库不适和用来静态编译,最后给出解决方案就是将applets/applets.c中这部分内容给去掉,也就是19-27行。

 

然后再make进行编译。

     不多久又报错了,看看具体错误:

 

 

[root@localhost busybox-1.9.2]# make install
  CC      ipsvd/tcpudp.o
In file included from /usr/local/arm/4.4.3/bin/../arm-none-linux-gnueabi//sys-root/usr/include/linux/netfilter_ipv4.h:8,
                 from ipsvd/tcpudp.c:33:
/usr/local/arm/4.4.3/bin/../arm-none-linux-gnueabi//sys-root/usr/include/linux/netfilter.h:55: error: field 'in' has incomplete type
/usr/local/arm/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 'sig_term_handler':
ipsvd/tcpudp.c:70: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c: In function 'connection_status':
ipsvd/tcpudp.c:116: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:117: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:117: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c: In function 'sig_child_handler':
ipsvd/tcpudp.c:126: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:128: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:129: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:130: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:133: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c: In function 'tcpudpsvd_main':
ipsvd/tcpudp.c:164: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:178: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:182: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:184: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:192: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:192: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:193: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:193: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:212: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:218: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:219: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:253: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:254: warning: dereferencing type-punned pointer will break strict-aliasing rules
ipsvd/tcpudp.c:276: warning: dereferencing type-punned pointer will break strict-aliasing rules

ipsvd/tcpudp.c:330: warning: ignoring return value of 'write', declared with attribute warn_unused_result
make[1]: *** [ipsvd/tcpudp.o] Error 1
make: *** [ipsvd] Error 2
[root@localhost busybox-1.9.2]#

看到说在我们下载的交叉编译库中有个头文件中的inin6类型不对,解决的办法就是:

     .../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h的开头
添加缺少的头文件:
     #include <netinet/in.h>

     然后再进行编译。

[root@localhost busybox-1.9.2]# make install
  LINK    busybox_unstripped
Trying libraries: crypt m
Failed: busybox_unstripped arm-linux-gcc  -static   applets/built-in.o  archival/lib.a  archival/libunarchive/lib.a  console-tools/lib.a  coreutils/lib.a  coreutils/libcoreutils/lib.a  debianutils/lib.a  e2fsprogs/lib.a  editors/lib.a  findutils/lib.a  init/lib.a  ipsvd/lib.a  libbb/lib.a  libpwdgrp/lib.a  loginutils/lib.a  miscutils/lib.a  modutils/lib.a  networking/lib.a  networking/libiproute/lib.a  networking/udhcp/lib.a  procps/lib.a  runit/lib.a  selinux/lib.a  shell/lib.a  sysklogd/lib.a  util-linux/lib.a  archival/built-in.o  archival/libunarchive/built-in.o  console-tools/built-in.o  coreutils/built-in.o  coreutils/libcoreutils/built-in.o  debianutils/built-in.o  e2fsprogs/built-in.o  editors/built-in.o  findutils/built-in.o  init/built-in.o  ipsvd/built-in.o  libbb/built-in.o  libpwdgrp/built-in.o  loginutils/built-in.o  miscutils/built-in.o  modutils/built-in.o  networking/built-in.o  networking/libiproute/built-in.o  networking/udhcp/built-in.o  procps/built-in.o  runit/built-in.o  selinux/built-in.o  shell/built-in.o  sysklogd/built-in.o  util-linux/built-in.o  m crypt -Wl,--start-group -lcrypt -lm -Wl,--end-group
Output of:
arm-linux-gcc -static -o busybox_unstripped -Wl,--sort-common -Wl,--sort-section -Wl,alignment -Wl,--gc-sections -Wl,--start-group applets/built-in.o archival/lib.a archival/libunarchive/lib.a console-tools/lib.a coreutils/lib.a coreutils/libcoreutils/lib.a debianutils/lib.a e2fsprogs/lib.a editors/lib.a findutils/lib.a init/lib.a ipsvd/lib.a libbb/lib.a libpwdgrp/lib.a loginutils/lib.a miscutils/lib.a modutils/lib.a networking/lib.a networking/libiproute/lib.a networking/udhcp/lib.a procps/lib.a runit/lib.a selinux/lib.a shell/lib.a sysklogd/lib.a util-linux/lib.a archival/built-in.o archival/libunarchive/built-in.o console-tools/built-in.o coreutils/built-in.o coreutils/libcoreutils/built-in.o debianutils/built-in.o e2fsprogs/built-in.o editors/built-in.o findutils/built-in.o init/built-in.o ipsvd/built-in.o libbb/built-in.o libpwdgrp/built-in.o loginutils/built-in.o miscutils/built-in.o modutils/built-in.o networking/built-in.o networking/libiproute/built-in.o networking/udhcp/built-in.o procps/built-in.o runit/built-in.o selinux/built-in.o shell/built-in.o sysklogd/built-in.o util-linux/built-in.o -Wl,--end-group -Wl,--start-group -lcrypt -lm -Wl,--end-group
==========
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
networking/lib.a(ipcalc.o): In function `ipcalc_main':
ipcalc.c:(.text.ipcalc_main+0x29c): warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(inetd.o): In function `getconfigent':
inetd.c:(.text.getconfigent+0x33c): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
libbb/lib.a(create_icmp6_socket.o): In function `create_icmp6_socket':
create_icmp6_socket.c:(.text.create_icmp6_socket+0x8): warning: Using 'getprotobyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(inetd.o): In function `config':
inetd.c:(.text.config+0x350): 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
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] Error 1
[root@localhost busybox-1.9.2]#

修改 busybox-1.9.2/networking/libiproute/iptunnel.c
#include <asm/types.h>
# 後面加上
#include <asm/byteorder.h>




(没路了,要么交叉编译所需要的库,(痛苦的事情,我没成功),
要么重新配置下,去掉selinux和loging中的pam就OK了)(这个方法没验证。。。)

 

     make 编译终于通过了!!!

     结束后会在当前目录下看到busybox这个生成的_install文件夹。

 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值