开发板为韦东山老师的imx6ull开发板。
在/home/book/nfs_rootfs/下创建一个文件夹:
使用tar指令解压busybox-1.31.1
tar -vxfj busybox-1.31.1.tar.ba2
解压完后内容如下:
1、打开busybox的顶层的Makefile,添加ARCH和CROSS_COMPILE的值
164 CROSS_COMPILE ?= /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
......
190 ARCH ?= arm
2、busybox中文字符支持
打开文件busybox-1.31.1/libbb/printable_string.c,修改printab_string函数
第 31 和 32 行,当字符大于 0X7F 以后就跳出去了。
第 45 和 46 行,如果支持 UNICODE 码的话,当字符大于 0X7F 就直接输出‘?’。
所以我们需要对这 4 行代码进行修改,修改以后如下所示:
12 const char* FAST_FUNC printable_string(uni_stat_t *stats, const char
*str)
13 {
14 char *dst;
15 const char *s;
16
17 s = str;
18 while (1) {
......
30 if (c < ' ')
31 break;
32 /* 注释掉下面这个两行代码 */
33 /* if (c >= 0x7f)
34 break; */
35 s++;
36 }
37
38 #if ENABLE_UNICODE_SUPPORT
39 dst = unicode_conv_to_printable(stats, str);
40 #else
41 {
42 char *d = dst = xstrdup(str);
43 while (1) {
44 unsigned char c = *d;
45 if (c == '\0')
46 break;
47 /* 修改下面代码 */
48 /* if (c < ' ' || c >= 0x7f) */
49 if( c < ' ')
50 *d = '?';
51 d++;
52 }
......
59 #endif
60 return auto_string(dst);
61 }
接着打开文件 busybox-1.29.0/libbb/unicode.c,
第 1022 行,当字符大于 0X7F 以后, *d++就为‘?’。
第 1030 和 1031 行,当字符大于 0X7F 以后, *d 也为‘?’。
1003 static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t
*stats, const char *src, unsigned width, int flags)
1004 {
1005 char *dst;
1006 unsigned dst_len;
1007 unsigned uni_count;
1008 unsigned uni_width;
1009
1010 if (unicode_status != UNICODE_ON) {
1011 char *d;
1012 if (flags & UNI_FLAG_PAD) {
1013 d = dst = xmalloc(width + 1);
......
1022 /* 修改下面一行代码 */
1023 /* *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; */
1024 *d++ = (c >= ' ') ? c : '?';
1025 src++;
1026 }
1027 *d = '\0';
1028 } else {
1029 d = dst = xstrndup(src, width);
1030 while (*d) {
1031 unsigned char c = *d;
1032 /* 修改下面一行代码 */
1033 /* if (c < ' ' || c >= 0x7f) */
1034 if(c < ' ')
1035 *d = '?';
1036 d++;
1037 }
1038 }
......
1044 return dst;
1045 }
......
1047
1048 return dst;
1049 }
3、配置busybox
根我们编译 Uboot、 Linux kernel 一样,我们要先对 busybox 进行默认的配置,有以下几种
配置选项:
①、 defconfig,缺省配置,也就是默认配置选项。
②、 allyesconfig,全选配置,也就是选中 busybox 的所有功能
③、 allnoconfig,最小配置。
我们一般使用默认配置即可,因此使用如下命令先使用默认配置来配置一下 busybox:
make defconfig
busybox 也支持图形化配置,通过图形化配置我们可以进一步选择自己想要的功能,输入
如下命令打开图形化配置界面:
make menuconfig
配置路径如下:
Location:
-> Settings
-> Build static binary (no shared libs)
继续配置如下路径选项
Location:
-> Settings
-> vi-style line editing commands
继续配置如下路径配置项:
Location:
-> Linux Module Utilities
-> Simplified modutils
继续配置如下路径配置项:
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
最后就是使能 busybox 的 unicode 编码以支持中文,配置路径如下:
Location:
-> Settings
-> Support Unicode
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables
busybox 的配置就到此结束了
4、编译busybox
配置好 busybox 以后就可以编译了,我们可以指定编译结果的存放目录
make install CONFIG_PREFIX=/home/book/nfs_rootfs/seocnd_busybox
编译完之后在向second_busybox中添加其他文件:
在second_busybox目录创建lib文件夹
进入 /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/libc/lib目录下
cp *so* *.a /home/book/nfs_rootfd/second_busybox/lib/ -d
后面的“-d”表示拷贝符号链接,这里有个比较特殊的库文件: ld-linux-armhf.so.3,此库文件也是个符号链接,相当于 Windows 下的快捷方式。会链接到库 ld-2.19-2014.08-1-git.so 上,输入命令“ls ld-linux-armhf.so.3 -l”查看此文件详细信息
ld-linux-armhf.so.3 后面有个“->”,表示其是个软连接文件,链接到文件 ld-2.19-2014.08-1-git.so,因为其是一个“快捷方式”,因此大小只有 24B。但是, ld-linuxarmhf.so.3 不能作为符号链接,否则的话在根文件系统中执行程序无法执行!所以我们需要 ldlinux-armhf.so.3 完成逆袭,由“快捷方式”变为“本尊”,方法很简单,那就是重新复制 ld-linuxarmhf.so.3,只是不复制软链接即可,先将 rootfs/lib 中的 ld-linux-armhf.so.3 文件删除掉,命令
如下:
rm ld-linux-armhf.so.3
然 后 重 新 进 入 到/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/libc/lib目录中,重新拷贝 ld-linux-armhf.so.3,命令如下:
cp ld-linux-armhf.so.3 /home/book/nfs_rootfs/sencond_busybox/lib/
此时 ld-linux-armhf.so.3 已经不是软连接了,而是实实在在的一个库文件.
继续进入如下目录中:
/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/lib
此目录下也有很多的的*so*和.a 库文件,我们将其也拷贝到 second_busybox/lib 目录中,命令如下:
cp *so* *.a /home/book/nfs_rootfd/second_busybox/lib/ -d
向 second_busybox 的“usr/lib”目录添加库文件
/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/libc/usr/lib
将此目录下的 so 和.a 库文件都拷贝到 second_busybox/usr/lib 目录中,命令如下:
cp *so* *.a /home/book/nfs_rootfd/second_busybox/lib/ -d
至此,根文件系统的库文件就全部添加好了,可以使用“du”命令来查看一下 second_busybox/lib 和
second_busybox/usr/lib 这两个目录的大小,命令如下:
du ./lib ./usr/lib/ -sh
创建其他文件夹
在根文件系统中创建其他文件夹,如 dev、 proc、 mnt、 sys、 tmp 和 root 等,
根文件系统测试
打开开发板,在开发板倒数的3秒中,随意按下键盘,然后输入
selenv bootargs `console=ttymxc0,115200,root=/dev/nfs nfsroot=192.168.5.11:/home/book/nfs_rootfs/second_busybox ip=192.168.5.9:192.168.5.11:192.168.1.1:255.255.255.0::eth0:off
然后在输入boot。