编译&更新busybox

测试速度时候需要使用time命令,现在使用的busybox没有提供,自己重新编译新的busybox。

1. 从www.busybox.net下载最新版本1.7.2;
2. 解压缩,进入目录;
3. 执行"make menuconfig"发现默认大多数cmd都选中了,就按照默认的来编译吧,除了
miscutil->taskset
    导致错误miscutils/taskset.c:17: error: parse error before '*' token
linuxmod->kernel-2.4 support
    导致错误In function `insmod_main': undefined reference to `query_module'
应该是arm-linux-gcc的glibc版本和busybox版本的匹配出了问题;
4. 修改Makefile内容,令CROSS_COMPILE ?=arm-linux- ARCH ?= arm;
这里必须在Makefile中指定ARCH=arm,如果只是在编译的时候指定"make CROSS_COMPILE=arm-linux- ARCH=arm",那么make install的时候会重新编译,得到的busybox是i386架构的,从而导致cp生成的cmd到rootfs处时,系统启动时候会提示:
    “request_module: runaway loop modprobe binfmt-464c”
5. 执行make得到busybox,执行make install在"busybox_$(VERSION)/_install"下得到bin, sbin, usr/bin, usr/sbin等。
6. 拷贝_install/下的所有内容到/data/rootfs2.6下替换原来的东西。
7. 在/data/rootfs2.6下执行
    mknod dev/null c 1 3
    chmod 666 dev/null
否则启动时候提示:
    init: can't open '/dev/null': No such file or directory
不知道why新编译出来的需要访问/dev/null设备。

参考文档:
 http://weibing.blogbus.com/logs/4453804.html
 http://www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=380&start=0&show=50
<think>好的,我现在需要处理用户的问题,用户想知道如何检查libc.so是否支持getrandom,以及如何使用自定义编译编译busybox。用户之前提供的引用中有关于编译固件和busybox时出现的警告,但用户现在明确这两个问题需要分开处理。 首先,针对检查libc.so是否支持getrandom的问题。用户之前的问题中已经给出了几种方法,比如检查glibc版本、使用nm、readelf工具、动态加载测试等。我需要确保这些方法在回答中被正确涵盖,同时考虑用户可能是在交叉编译环境或者使用自定义工具链的情况下操作,可能需要调整路径或工具链的前缀。比如,用户如果使用自定义编译链,可能需要使用对应的交叉编译工具,如aarch64-linux-gnu-nm而不是本地的nm工具。需要提醒用户注意工具链的前缀,并正确指定libc.so的路径,可能在自定义编译链的sysroot目录下。 接下来是关于使用自定义编译编译busybox的步骤和配置。用户提到的引用中出现了编译busybox时的警告,这可能与编译选项或环境有关。用户需要的是步骤和配置,特别是使用自定义工具链的情况。首先,用户需要设置交叉编译环境变量,如CC、CROSS_COMPILE、ARCH等。然后,配置busybox,可以选择menuconfig界面调整设置,比如静态/动态链接,启用或禁用特定功能。之后,执行编译和安装,可能需要指定安装路径。同时,用户可能遇到依赖问题或路径错误,需要检查工具链的路径是否正确,库文件是否齐全。用户之前遇到的警告可能与编译器优化或安全检查有关,可能需要在配置时调整CFLAGS或关闭某些加固选项。 在回答时,需要将两个问题分开处理,结构清晰。每个部分分步骤说明,给出具体的命令示例,特别是替换工具链前缀和路径的部分。同时,需要提醒用户可能遇到的问题,比如符号链接问题、依赖缺失,以及如何处理编译中的警告,比如忽略或调整编译选项。确保用户能够根据步骤操作,并理解每个步骤的作用。 此外,用户可能是在嵌入式系统或特定硬件环境下工作,所以需要强调交叉编译的注意事项,比如正确设置sysroot,确保所有依赖库在工具链中存在。对于检查libc.so的支持,可能需要使用工具链中的对应工具,而不是宿主机的工具。例如,使用${CROSS_COMPILE}nm而不是系统的nm。 最后,总结常见问题,帮助用户快速排查可能出现的错误,比如工具链路径未设置、库文件缺失、配置选项错误等。确保回答全面,覆盖用户可能遇到的各种情况,并参考之前的回答,保持一致性。</think>### 如何检查 `libc.so` 是否支持 `getrandom`? --- #### **方法 1:通过交叉工具链检查符号表** 若使用自定义编译链(如 `aarch64-linux-gnu`),需使用对应工具链的 `nm` 或 `readelf`: ```bash # 示例:使用交叉工具链的 nm 检查符号 ${CROSS_COMPILE}nm -D ${SYSROOT}/lib/libc.so.6 | grep getrandom # 若工具链路径已配置(例如 CROSS_COMPILE=aarch64-linux-gnu-) aarch64-linux-gnu-nm -D /path/to/sysroot/lib/libc.so.6 | grep getrandom ``` - **输出期望**:`T getrandom`(符号存在)或为空(不支持)。 --- #### **方法 2:验证 glibc 版本** 自定义编译链的 `libc.so` 版本可能独立于系统版本,需直接查询其版本: ```bash # 执行交叉编译链中的 libc.so ${SYSROOT}/lib/libc.so.6 --version # 输出示例: GNU C Library (GNU libc) stable release version 2.32. ``` - **判断**:glibc ≥ 2.25 才支持 `getrandom`。 --- #### **方法 3:动态加载测试(交叉编译验证)** 编写测试程序,使用自定义工具链编译运行: ```c // test_getrandom.c #include <sys/random.h> #include <stdio.h> int main() { char buf[16]; if (getrandom(buf, sizeof(buf), 0) == sizeof(buf)) { printf("Supported\n"); return 0; } return 1; } ``` 编译命令(需指定 `sysroot` 和工具链): ```bash ${CROSS_COMPILE}gcc --sysroot=${SYSROOT} test_getrandom.c -o test_getrandom ``` - **运行验证**: - 若在目标设备上输出 `Supported`,则支持。 - 若编译报错 `undefined reference to getrandom`,则 `libc.so` 不支持该函数。 --- ### 使用自定义编译编译 BusyBox 的步骤 --- #### **1. 准备工具链和环境变量** 假设自定义工具链前缀为 `arm-linux-gnueabihf-`,路径已加入 `PATH`: ```bash export CROSS_COMPILE=arm-linux-gnueabihf- export ARCH=arm export PATH=/path/to/toolchain/bin:$PATH ``` --- #### **2. 获取 BusyBox 源码并配置** ```bash wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -xf busybox-1.36.1.tar.bz2 cd busybox-1.36.1 # 生成默认配置 make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} defconfig ``` --- #### **3. 自定义配置(关键步骤)** 启动交互配置界面,调整以下选项: ```bash make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} menuconfig ``` - **重要配置项**: - **静态链接**(减少依赖): ``` Settings → Build Options → Build static binary (no shared libs) → 按需选择 ``` - **指定 sysroot**(若工具链依赖外部库): ``` Settings → Cross Compiler Options → Additional CFLAGS → -I/path/to/sysroot/include Settings → Cross Compiler Options → Additional LDFLAGS → -L/path/to/sysroot/lib ``` - **禁用冗余功能**(减小体积): ``` Networking Utilities → 取消不需要的协议(如 ifconfig、route) Linux System Utilities → 保留必要功能(如 mdev) ``` --- #### **4. 编译与安装** ```bash # 编译(启用多线程) make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -j$(nproc) # 安装到指定目录(如 output/) make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} CONFIG_PREFIX=/path/to/output install ``` --- #### **5. 验证与调试** - **检查二进制格式**: ```bash file /path/to/output/bin/busybox # 期望输出:ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked... ``` - **解决编译警告**(如引用中的 `stdio2.h` 警告): - **原因**:GCC 的安全检查与代码不兼容。 - **方案**:在 `CFLAGS` 中禁用 `_FORTIFY_SOURCE`: ```bash make CFLAGS="-U_FORTIFY_SOURCE -O2" ... ``` --- ### 常见问题解决 1. **工具链路径错误**: ```bash # 错误提示:arm-linux-gnueabihf-gcc: not found # 解决:检查 PATH 或指定完整路径 export PATH=/opt/toolchain/arm/bin:$PATH ``` 2. **头文件/库缺失**: - 确保 `sysroot` 包含目标系统的头文件和库: ```bash --sysroot=/path/to/sysroot ``` 3. **动态链接失败**: - 若未静态编译,需将目标设备的 `libc.so` 等库拷贝到 `/lib` 目录。 --- ### 总结 - **检查 `getrandom` 支持**:优先通过交叉工具链的 `nm` 或动态测试验证。 - **编译 BusyBox**:关键为正确配置工具链路径、`sysroot` 和静态链接选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值