ARM Cortex A7 Buildroot系统无法执行C二进制程序求助
解决Buildroot ARM Cortex-A7平台下C程序执行报错"Could not open file (1): No such file or directory"的问题
你遇到的这个报错其实很容易误导人——看起来是程序文件找不到,但实际上是你的程序依赖的动态链接器(也就是程序的"解释器")在当前Buildroot系统里不存在或者不兼容。从你给出的/lib目录文件来看,你的系统用的是uClibc作为C标准库(文件里有ld-uClibc.so.0这类uClibc的链接器),但你的mcp23017程序大概率是用基于glibc的交叉工具链编译的,两者不匹配导致了这个错误。
下面是具体的解决步骤:
1. 先确认程序依赖的动态链接器
在你的交叉编译主机上,用readelf工具检查程序的解释器信息:
# 替换成你对应的交叉编译工具链的readelf,比如arm-buildroot-linux-uclibcgnueabihf-readelf arm-linux-gnueabihf-readelf -l mcp23017 | grep "Requesting program interpreter"
如果输出是类似[Requesting program interpreter: /lib/ld-linux-armhf.so.3],那就能实锤:程序期望的是glibc的动态链接器,但你的系统只有uClibc的,完全不兼容。
2. 用Buildroot自带的交叉工具链重新编译程序
这是最直接的解决方案:
- 找到你Buildroot编译完成后生成的交叉工具链,一般在
output/host/bin/目录下,工具链前缀应该是arm-buildroot-linux-uclibcgnueabihf- - 用这个工具链重新编译你的
mcp23017代码:
这样编译出来的程序会自动依赖系统里的arm-buildroot-linux-uclibcgnueabihf-gcc -o mcp23017 mcp23017.cld-uClibc.so.0,和你的Buildroot系统完美匹配。
3. 可选:静态编译程序(无需依赖系统动态库)
如果不想重新适配工具链,也可以尝试静态编译——把所有依赖的库都打包进程序里,这样程序运行时不需要动态链接器:
# 同样用Buildroot的交叉工具链,加上-static参数 arm-buildroot-linux-uclibcgnueabihf-gcc -static -o mcp23017 mcp23017.c
注意:静态编译会让程序体积变大,而且如果你的程序用到了动态加载库(比如dlopen)的功能,静态编译会导致这些功能失效。
4. 另一种可选方案:切换Buildroot的C库为glibc
如果你确实需要使用基于glibc的程序,可以修改Buildroot配置,换成glibc作为系统C库:
- 运行
make menuconfig进入配置界面 - 导航到
Toolchain->C library,选择glibc(默认可能是uClibc) - 保存配置后重新编译Buildroot,生成新的系统镜像烧录到目标板上,之后再运行你的程序就不会有问题了。
内容的提问来源于stack exchange,提问作者Marcel T
相关产品推荐
相关产品推荐

