应先验证交叉编译生成的二进制文件架构与权限:用file hello_arm确认为arm可执行格式,ls -l检查并补全执行权限;再通过scp传输至目标设备可写路径(如/tmp/),部署前须核对动态链接器兼容性及文件系统是否只读。

scp传输前先确认文件是否可执行
交叉编译生成的二进制文件(比如 hello_arm)默认没有执行权限,直接 scp 过去再 chmod +x 是常见做法,但容易漏掉——尤其在自动化脚本里。更稳妥的做法是:编译后立刻本地验证是否为 ELF ARM 可执行格式,并检查权限位。
- 用
file hello_arm确认输出含ARM aarch64或ARM executable,不是x86-64 - 用
ls -l hello_arm查看权限,若无x位,立即chmod +x hello_arm - 若目标设备是精简 Linux(如 BusyBox 环境),
scp可能不可用,得改用ftp或挂载 NFS 共享目录
目标设备上运行失败时优先查 libc 兼容性
最常遇到的错误是 ./hello_arm: No such file or directory ——这通常不是路径问题,而是动态链接器不匹配。宿主机用 arm-linux-gnueabihf-gcc 编译,默认链接的是 glibc,但很多嵌入式设备用的是 musl 或旧版 glibc。
- 用
readelf -l hello_arm | grep interpreter查看它想找哪个动态链接器(如/lib/ld-linux-armhf.so.3) - 登录目标设备,运行
ls /lib/ld-linux*看实际存在哪些,路径是否一致 - 解决办法:加
-static重新编译(arm-linux-gnueabihf-gcc -static -o hello_arm_static hello_arm.c),彻底绕过 libc 依赖
部署路径和用户权限要匹配设备实际环境
别默认往 /home/ 或 /tmp 传——有些嵌入式设备的 rootfs 是只读的,或者 /home 根本不存在。部署前必须确认目标路径可写、且有足够空间。
- 常用安全路径:
/tmp(多数设备临时可写)、/root(需 root 权限)、或应用专属目录如/usr/local/bin(需mount -o remount,rw /) - 传输命令示例:
scp hello_arm root@192.168.1.100:/tmp/,而不是:/home/ - 如果目标设备禁用了 root 密码登录,得提前配置好 SSH 密钥,否则
scp会卡住
调试阶段建议保留符号表并关掉 strip
正式发布前可以 strip 减小体积,但调试期千万别这么做。一旦出错,没符号表的 core dump 或 gdbserver 基本没法定位问题。
- 编译时不加
-s或--strip-all;也不要用${CROSS_COMPILE}strip处理二进制 - 加
-g编译(arm-linux-gnueabihf-gcc -g hello_arm.c -o hello_arm),方便后续用gdb-multiarch远程调试 - 注意:
readelf -S hello_arm能看到.debug_*段存在,才是带调试信息的











