arm-linux-gcc4.4.4编译busybox-1.25.1
编译出现了一些问题,是因为arm-linux-gcc 比较旧,而busybox 比较新
用较新的gcc 应该不会出问题。
1. tar -xjvf busybox-1.25.1.tar.bz2
2. make defconfig
3. make menuconfig
Busybox Setting ----->
Build Options ----->
//1选择将busybox进行静态编译
[*]Build BusyBox as a static binary (no shared libs)
//2.指定交叉编译器为
(arm-linux-)Cross Compiler prefix
保存退出
make
出现如下编译错误:
miscutils/nandwrite.c:151: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)
解决办法:
查MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义, 但arm-linux-gcc 使用的是交叉编译的路径,以我的为例,在如下位置。
/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/usr/include/mtd/mtd-abi.h
注意观察你的/usr/include 路径,找到正确使用的mtd-abi.h 文件。
把系统文件中的定义copy到交叉编译文件中即可。 可以看出新的文件是有的,旧的文件中没有该定义。这是移植常见的问题。
如果用旧一点的busybox 配旧一点的gcc, 就不会出现该符号,但相应也就不支持该功能。
修改后继续编译,出现如下编译错误:
util-linux/blkdiscard.c:72: error: 'BLKSECDISCARD' undeclared (first use in this function)
解决办法:
查该宏在linux/fs.h 中有定义, 找到交叉编译的multi-libs/usr/include/linux/fs.h, 把新版本添加的几个宏copy过来。
继续编译: 出现如下链接错误:
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x1b0): undefined reference to `setns'
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
解决办法:
setns 在何方定义就不清楚了, 一个简单的办法是屏蔽掉该模块
继续编译,通过。
用make install, 安装到./_INSTALL
另外:
用arm-linux-gcc4.4.4 编译busybox-1.23.2
无痛通过, 爽!
于是得出结论: 这是本贴的目的之一,
旧的gcc不要编译最新的代码, 你可能得不到最新功能(可能也根本不需要)
从此要减少开源代码编译成本!
编译出现了一些问题,是因为arm-linux-gcc 比较旧,而busybox 比较新
用较新的gcc 应该不会出问题。
1. tar -xjvf busybox-1.25.1.tar.bz2
2. make defconfig
3. make menuconfig
Busybox Setting ----->
Build Options ----->
//1选择将busybox进行静态编译
[*]Build BusyBox as a static binary (no shared libs)
//2.指定交叉编译器为
(arm-linux-)Cross Compiler prefix
保存退出
make
出现如下编译错误:
miscutils/nandwrite.c:151: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)
解决办法:
查MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义, 但arm-linux-gcc 使用的是交叉编译的路径,以我的为例,在如下位置。
/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/usr/include/mtd/mtd-abi.h
注意观察你的/usr/include 路径,找到正确使用的mtd-abi.h 文件。
把系统文件中的定义copy到交叉编译文件中即可。 可以看出新的文件是有的,旧的文件中没有该定义。这是移植常见的问题。
如果用旧一点的busybox 配旧一点的gcc, 就不会出现该符号,但相应也就不支持该功能。
修改后继续编译,出现如下编译错误:
util-linux/blkdiscard.c:72: error: 'BLKSECDISCARD' undeclared (first use in this function)
解决办法:
查该宏在linux/fs.h 中有定义, 找到交叉编译的multi-libs/usr/include/linux/fs.h, 把新版本添加的几个宏copy过来。
继续编译: 出现如下链接错误:
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x1b0): undefined reference to `setns'
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
解决办法:
setns 在何方定义就不清楚了, 一个简单的办法是屏蔽掉该模块
继续编译,通过。
用make install, 安装到./_INSTALL
另外:
用arm-linux-gcc4.4.4 编译busybox-1.23.2
无痛通过, 爽!
于是得出结论: 这是本贴的目的之一,
旧的gcc不要编译最新的代码, 你可能得不到最新功能(可能也根本不需要)
从此要减少开源代码编译成本!