You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.c
    
    这样编译出来的程序会自动依赖系统里的ld-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:19:59