嵌入式Linux开发者Unix环境搭建避坑指南
|
“嵌入式Linux开发者Unix环境搭建避坑指南”——这名字是我上个季度在调试i.MX8MQ EVK板卡时,一边重装第7次macOS Monterey + Xcode 14.3.1 + homebrew + crosstool-ng 1.25.0组合,一边用语音备忘录记下的。当时串口log里反复跳出“cannot find -lcrypto”,而openssl-1.1.1w明明已用--prefix=/opt/openssl-static编译进/opt/openssl-static/lib,ldconfig却压根不扫这个路径。我盯着Terminal发了三分钟呆,手边泡冷的茉莉花茶杯底积了一圈茶渍。 上周二(4月23日)帮深圳南山一个做RISC-V SoC固件的团队远程排错,他们全组6人统一用macOS Sonoma 14.4,搭完QEMU 8.2.0 + Buildroot 2024.02后,所有人在run qemu-system-riscv64时卡在“smp: CPU1 failed to start”。查了三天——最后发现是Homebrew默认安装的dtc(Device Tree Compiler)版本是1.7.0,而Buildroot 2024.02的defconfig强制要求dtc >= 1.7.1。他们删了brew install dtc装的包,改用./configure --prefix=/usr/local && make && sudo make install从源码编译dtc 1.7.2,问题当场消失。这事连ArchWiki的QEMU RISC-V页面都没提——就卡在Buildroot .config里那个 CONFIG_DTC_VERSION="1.7.2" 的隐式依赖上。 最坑的是交叉编译链的时间戳污染。上个季度我在Ubuntu 22.04 LTS虚拟机里用crosstool-ng 1.25.0构建aarch64-unknown-linux-gnueabihf工具链,全程没报错,但烧录到树莓派CM4后跑strace总是segment fault。抓包对比发现:工具链生成的gcc二进制里内嵌的/lib64/ld-linux-aarch64.so.1路径指向宿主机/usr/aarch64-unknown-linux-gnueabihf/sysroot/lib/ld-linux-aarch64.so.1,而这个so文件的mtime居然是2021年11月——因为crosstool-ng默认启用--enable-symlinks且不校验sysroot下libc版本发布时间,导致它悄悄复用了我半年前废弃的glibc 2.33缓存。换成--disable-symlinks并手动rm -rf ~/.crosstool-ng/builds/aarch64-unknown-linux-gnueabihf/sysroot后重建,耗时多出47分钟,但烧录后的strace终于返回正常syscall trace。这点连crosstool-ng官方README.md的“Advanced Options”章节都没写明。 有人信誓旦旦说VS Code Remote-SSH能完美替代tmux+vim组合。试过就知道:当串口终端通过socat映射为/dev/ttys003,而VS Code的serial monitor插件每次重启都重新分配端口号——你在settings.json里写的"serial.port": "/dev/ttys003"下次打开就变成"/dev/ttys004",偏偏它不报错,只默默静默丢包。我昨天还在杭州滨江一家创业公司看到工程师为这事重刷了3次OpenOCD固件——就因为VS Code插件把波特率从115200自动降成9600且不提示。 MacBook Pro M1芯片上用qemu-user-static运行armhf容器?别试了。实测跑buildroot ext2镜像里的busybox ash,fork()会随机触发SIGILL,gdb反汇编定位到qemu-arm-static对M1原生模拟器中__kernel_rt_sigreturn调用栈处理有竞态缺陷。临时解法是加-Q /usr/bin/qemu-arm-static启动,但这就彻底绕过codesign验证——苹果去年十月起的公证策略会让这种签名失效的binary在macOS Sonoma里直接被Gatekeeper拦截。这事我上个季度报过bug到QEMU mailing list,至今没人回。现在我的做法是——真要测armhf,就老老实实用树莓派Zero 2 W搭物理环境。
文章配图,仅供参考 嵌入式Linux开发者Unix环境搭建避坑指南我认为它优点在“新技术”。比如最近两周试的nix-shell --pure -p linux_6_6 gawk gcc-unwrapped dtc_1_7_2 qemu_full ——整个编译链完全隔离,Buildroot config里指定LINUX_VERSION=6.6.25后,nix会自动下载对应内核patch、校验sha256,连Kconfig碎片依赖都由nixpkgs自动resolve。这比crosstool-ng快3倍,错误提示也清晰到能指出“missing CONFIG_ARM64_MODULE_PLTS=y in kernel config”。但它有个硬伤:目前nixpkgs里没有支持riscv64-linux-gnu-gcc带Zicsr/Zifencei扩展的toolchain封装,得自己写overlay。所以……我现在正在学Nix语言写自定义overlay。你要是也打算试,建议先备份Time Machine——上个季度我因误删~/.nix-defexpr花了11小时重建flake。 短路保护:sudo rm -rf /usr/local/bin/qemu-system- (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

