Busybox 1.17.4 编译及错误解决方案

2.1 Makefile中添加编译工具:
#vim Makefile
找到OSS_COMPILE ?=
修改为:CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-
也可以运行make menuconfig,进入配置接口来配置,这样做的前提是必须在$PATH中已添加了交叉编译gcc
#make menuconfig 
进入“Busybox Settings ——>”
“Build options ---->”
选择( ) Cross Compiler prefix 输入arm-linux-

2.2 使用默认配置进行编译
#make defconfig 
会有一些默认的选项配置,同时需要修改以下选项,以避免出现一些错误:
 ·  Busybox Settings --->  
·       Build Options --->  
·            [*] Build BusyBox as a static binary (no shared libs) //这里编译为静态库  
·            [ ] Build with Large File Support //这里要去掉这一项  
·            () Cross Compiler perfix //设置交叉编译器路径  
·       Installation Options --->  
·            [*] Don't use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替 
·  Linux System Utilities --->  
·       [ ] mkfs_ext2  
·       [ ] mkfs_vfat  //这两项不选,否则编译会报错


然后make,
通常会有一些错误,我们的目标是先通过编译。所以对下面几个错误采用最简便的办法处理通过。

#make
miscutils/ionice.c: In function `ioprio_set':
miscutils/ionice.c:16: error: `SYS_ioprio_set' undeclared (first use in this function)
miscutils/ionice.c:16: error: (Each undeclared identifier is reported only once
miscutils/ionice.c:16: error: for each function it appears in.)
miscutils/ionice.c: In function `ioprio_get':
miscutils/ionice.c:21: error: `SYS_ioprio_get' undeclared (first use in this function)
make[1]: *** [miscutils/ionice.o] Error 1
make: *** [miscutils] Error 2

将引起错误的功能去掉,这个ionice的位置:
Miscellaneous Utilities  --->     
[ * ] ionice                                     

重新make ,出现第2次make 错误:
#make
networking/interface.c:807: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)
networking/interface.c:807: error: initializer element is not constant
networking/interface.c:807: error: (near initialization for `ib_hwtype.type')
make[1]: *** [networking/interface.o] Error 1
make: *** [networking] Error 2
在出错位置看一下源码,发现:
#if ENABLE_FEATURE_HWIB
……
由于跟infiniband 没啥关系,不如关闭这个:ENABLE_FEATURE_HWIB
在.config 中直接关掉,或者到make menuconfig中关掉:
Busybox Settings--->
Busybox Library Tuning-->
[]Support infiniband HW


第3次make错误:
#make
networking/libiproute/ipaddress.c: In function `print_linkinfo':
networking/libiproute/ipaddress.c:167: error: `IFLA_OPERSTATE' undeclared (first use in this function)
networking/libiproute/ipaddress.c:167: error: (Each undeclared identifier is reported only once
networking/libiproute/ipaddress.c:167: error: for each function it appears in.)
make[1]: *** [networking/libiproute/ipaddress.o] Error 1
make: *** [networking/libiproute] Error 2

找到源码位置,
我们对代码做如下修改:networking/libiproute/ipaddress.c
         printf("master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MAST    ER]), b1)); 
165         } 
166 #endif 
//在这里添加宏判断:
#ifdef IFLA_OPERSTATE   

167         if (tb[IFLA_OPERSTATE]) { 
168                 static const char operstate_labels[] ALIGN1 = 
169                         "UNKNOWN\0""NOTPRESENT\0""DOWN\0""LOWERLAYERDOWN\0" 
170                         "TESTING\0""DORMANT\0""UP\0"; 
171                 printf("state %s ", nth_string(operstate_labels, 
172                                         *(uint8_t *)RTA_DATA(tb[IFLA_OPERSTA    TE]))); 
173         } 
#endif //这里添加宏结束
174if (G_filter.showqueue)

第4次编译,成功:
CC      util-linux/volume_id/romfs.o
  CC      util-linux/volume_id/sysv.o
  CC      util-linux/volume_id/udf.o
  CC      util-linux/volume_id/util.o
  CC      util-linux/volume_id/volume_id.o
  CC      util-linux/volume_id/xfs.o
  AR      util-linux/volume_id/lib.a
  LINK    busybox_unstripped
Trying libraries: crypt m
 Library crypt is not needed, excluding it
 Library m is needed, can't exclude it (yet)
Final link with: m
  DOC     busybox.pod
  DOC     BusyBox.txt
  DOC     BusyBox.1
  DOC     BusyBox.html

附:
如果Linux System Utilities --->  
·       [*] mkfs_ext2  
·       [ *] mkfs_vfat  //如果这两项选上,编译会报错如下:

In file included from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/cache.h:4,
                 from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fs.h:18,
                 from util-linux/mkfs_ext2.c:11:
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../.



继续编译,发现还是有错误:

networking/libiproute/ipaddress.c:167: error: `IFLA_OPERSTATE' undeclared (first use in this function)

这个错误其实是busybox的一个bug,一直未解决,我们对代码做如下修改:

 

networking/libiproute/ipaddress.c

[cpp]  view plain copy
  1.        
  2. 164 164                 printf("master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));   
  3. 165 165         }   
  4. 166 166 #endif   
  5.     167 #ifdef IFLA_OPERSTATE   
  6. 167 168         if (tb[IFLA_OPERSTATE]) {   
  7. 168 169                 static const char operstate_labels[] ALIGN1 =   
  8. 169 170                         "UNKNOWN/0""NOTPRESENT/0""DOWN/0""LOWERLAYERDOWN/0"   
  9. …   …      
  10. 171 172                 printf("state %s ", nth_string(operstate_labels,   
  11. 172 173                                         *(uint8_t *)RTA_DATA(tb[IFLA_OPERSTATE])));   
  12. 173 174         }   
  13.     175 #endif   
  14. 174 176         if (G_filter.showqueue)   
  15. 175 177                 print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));   
  16. 176 178    

 

networking/libiproute/iplink.c

[cpp]  view plain copy
  1. *  
  2.   274   274         return ipaddr_list_or_flush(argv, 0);   
  3.   275   275 }   
  4.   276   276    
  5.     277 #ifdef IFLA_LINKINFO   
  6.   277   278 #ifndef NLMSG_TAIL   
  7.   278   279 #define NLMSG_TAIL(nmsg) /   
  8.   279   280         ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))   
  9.   …     …      
  10.   360   361                 return 2;   
  11.   361   362         return 0;   
  12.   362   363 }   
  13.     364 #endif   
  14.   363   365    
  15.   364   366 /* Return value becomes exitcode. It's okay to not return at all */   
  16.   365   367 int do_iplink(char **argv)   
  17.   366   368 {   
  18.   367   369         static const char keywords[] ALIGN1 =   
  19.     370 #ifdef IFLA_LINKINFO   
  20.   368   371                 "add/0""delete/0""set/0""show/0""lst/0""list/0";   
  21.     372 #else   
  22.     373                 "set/0""show/0""lst/0""list/0";   
  23.     374 #endif   
  24.   369   375         if (*argv) {   
  25.   370   376                 smalluint key = index_in_substrings(keywords, *argv);   
  26.   371   377                 if (key > 5) /* invalid argument */   
  27.   372   378                         bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);   
  28.   373   379                 argv++;   
  29.     380 #ifdef IFLA_LINKINFO   
  30.   374   381                 if (key <= 1) /* add/delete */   
  31.   375   382                         return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);   
  32.   376   383                 else if (key == 2) /* set */   
  33.     384 #else   
  34.     385                 if (key == 0) /* set */   
  35.     386 #endif   
  36.   377   387                         return do_set(argv);   
  37.   378   388         }   
  38.   379   389         /* show, lst, list */   

 

完成后继续编译

执行 make install,终于在_install文件夹下生成了工具包

 

4、制作文件系统

可以先创建一个工作目录,如myroot,在工作目录下 创建以下目录:bin sbin dev etc lib home root usr var proc mnt tmp sys

执行 mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys

etc 下面要写两个文件fstab inittab 和一个文件夹init.d

 

(a) fstab 的内容是:

[cpp]  view plain copy
  1. proc /proc proc defaults 0 0  
  2. tmpfs /tmp tmpfs defaults 0 0  
  3. sysfs /sys sysfs defaults 0 0  
  4. tmpfs /dev tmpfs defaults 0 0  

(b) fstab 文件的作用

文 件/etc/fstab 存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab 键分开。同时fsckmount 、umount 的等命令都利用该程序。

inittab 的内容是:

[cpp]  view plain copy
  1. #/etc/inittab  
  2. ::sysinit:/etc/init.d/rcS  
  3. ::askfirst:-/bin/sh   
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  

 

(c) init.d/rcS 文件的内容:

[cpp]  view plain copy
  1. #!/bin/sh  
  2. ifconfig eth0 192.168.1.17  
  3. mount -t tmpfs mdev /dev  
  4. mkdir /dev/pts  
  5. mount -t devpts devpts /dev/pts  
  6. mount -t sysfs sysfs /sys  
  7. mount -a  
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  9. mdev –s  
  10. echo leohui1988_busybox  

 

 

(d)在/dev 下建立设备节点:Console null

[cpp]  view plain copy
  1. mknod dev/console c 5 1  
  2. mknod dev/null c 1 3  

 

(e)将编译busybox生成的/bin和/sbin下的工具拷贝到myroot下的/bin和/sbin下

 

(f)使用mkyaffs2image制作yaffs文件系统镜像

 

./mkyaffs2image myroot rootfs.yaffs

 

 

将yaffs烧写至开发板,可在终端下看到leohui1988_busybox的输出,最基本的文件系统制作成功!

 

 

注意:

如果使用静态编译,那么后面我们移植到开发板的程序也必须静态编译,这样的话就比较占存储空间,为此可以将busybox进行动态编译,使用共享链接库来减小体积,同时也方便后面程序进行编译和移植。

动态编译步骤与以上类似,只是把 [ ] Build BusyBox as a static binary (no shared libs)这一项替换掉。其余步骤一样,完成后将bin和sbin拷贝到文件系统的bin,sbin下,然后将linuxrc这个链接文件也拷入文件系统根目录下,最初我没放linuxrc这个链接文件时,启动显示init错误。之后再将arm-linux交叉编译工具的lib(我的路径是/usr/local/arm/3.4.1/arm-linux/lib)库拷贝到文件系统lib下。制作成镜像烧写至flash,启动成功!


2.3 生成根文件系统必需文件:
#make install
会在当前busybox 目录下生成_install子目录,目录下生成bin, sbin, usr三个子目录,并且生成linuxrc文件
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值