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

Beaglebone Black交叉编译失败:动态链接器缺失问题求助

解决Beaglebone Black上Buildroot uClibc-ng环境下交叉编译程序的动态链接问题

问题本质

你遇到的-sh: ./helloworld: not found是典型的动态链接器不匹配问题:用glibc工具链编译的程序依赖/lib/ld-linux.so.3,但你的Buildroot镜像使用uClibc-ng,板上的动态链接器是/lib/ld-uClibc.so.0,二者完全不兼容。

具体解决方法

1. 使用Buildroot生成的对应工具链编译

Buildroot会为目标系统生成专属交叉编译工具链,路径在Buildroot输出目录的output/host/bin/下,针对uClibc-ng的编译器是arm-buildroot-linux-uclibcgnueabihf-gcc。
编译helloworld时必须用这个编译器:

arm-buildroot-linux-uclibcgnueabihf-gcc helloworld.c -o helloworld

2. 验证程序的动态链接器

用Buildroot工具链中的readelf检查程序依赖的链接器:

arm-buildroot-linux-uclibcgnueabihf-readelf -d helloworld | grep interpreter

正常输出应该是:

[Requesting program interpreter: /lib/ld-uClibc.so.0]
如果输出是ld-linux.so.3,说明你误用了glibc工具链编译,必须切换回Buildroot生成的uClibc-ng工具链。

3. 修复切换glibc时的编译报错(若需替换C库)

如果一定要改用glibc作为系统C库,按以下步骤操作:

  • 清空之前的编译产物:make clean
  • 进入配置界面:make menuconfig
    • 导航到Toolchain -> C library,选择glibc
    • 检查Toolchain -> glibc version,选择Buildroot 2022.02.9支持的版本(推荐选默认的2.35)
    • 排查冲突包:部分软件包可能仅支持uClibc,需在Target packages中移除或替换这类包
  • 重新编译镜像:make -j$(nproc)

4. 静态编译(快速应急方案)

如果不想调整C库或工具链,可直接静态编译程序,将所有依赖打包进可执行文件:

arm-buildroot-linux-uclibcgnueabihf-gcc -static helloworld.c -o helloworld

静态编译后的程序无需板上的动态链接器即可运行,但会导致程序体积增大。

内容的提问来源于stack exchange,提问作者minimus_maximus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:16:04