如何在64位Ubuntu上编译可运行于32位Armbian的C程序
错误原因
- 静态链接报错:
gethostbyname属于glibc的NSS(名称服务切换)模块,该模块设计上依赖运行时的动态加载库,就算添加-static参数强制静态链接,运行时仍会尝试加载编译用glibc版本对应的nss动态库,当Armbian系统的glibc版本与交叉编译器携带的glibc版本不一致时,就会触发解析错误。 - 动态链接报错:交叉编译器默认的动态链接器路径、依赖库版本与Armbian运行环境不匹配,系统无法找到对应的程序加载器,因此抛出
No such file or directory错误。
解决方案
方案一:使用musl libc交叉编译器(推荐)
musl libc的NSS模块完全支持静态编译,不存在glibc的版本兼容问题,操作最简单:
- Ubuntu上安装对应交叉编译器:
sudo apt install gcc-arm-linux-musleabi g++-arm-linux-musleabi
- 替换原有编译命令即可:
arm-linux-musleabi-gcc -c test.c -o test.o arm-linux-musleabi-g++ -o test test.o -static
编译生成的全静态可执行文件可直接在32位Armbian上运行,无需额外依赖。
方案二:对齐动态链接运行环境
如果必须使用动态链接,可将Armbian的系统库同步到Ubuntu编译环境中:
- 将Armbian系统中的
/lib、/usr/lib完整目录拷贝到Ubuntu的/opt/armbian-rootfs路径下 - 编译时添加sysroot和动态链接器参数:
arm-linux-gnueabi-gcc -c test.c -o test.o arm-linux-gnueabi-g++ -o test test.o --sysroot=/opt/armbian-rootfs -Wl,-dynamic-linker=/lib/ld-linux-armhf.so.3
注意:需先在Armbian上执行ls /lib/ld-linux*确认实际动态链接器路径,将上述命令中的路径替换为实际值。
方案三:补充NSS静态库(不推荐)
如果坚持使用原有glibc交叉编译器做静态链接,可尝试添加NSS相关依赖库,兼容性不保证:
arm-linux-gnueabi-g++ -o test test.o -static -lrt -lnss_files -lnss_dns -lresolv
内容的提问来源于stack exchange,提问作者user1231247
相关产品推荐
相关产品推荐

