如何让cargo-binutils命令使用cargo xbuild替代cargo build?
解决cargo nm调用cargo build而非xbuild导致的自定义目标编译错误
你遇到的问题核心在于:cargo nm默认会触发标准的cargo build流程,但你的自定义目标i586-rust_dos.json属于无标准库的交叉编译场景,必须用cargo xbuild来处理核心库(core)的编译依赖——这也是为什么直接用cargo xbuild能正常工作,而cargo build会抛出找不到core crate的错误。
下面是两个可行的解决办法:
方法一:先手动用xbuild编译,再用cargo nm分析二进制
这是最直接的方案,分两步走:
- 先完成编译:
确保这一步执行成功,生成的二进制文件会在cargo xbuild --target i586-rust_dos.json --bin rust_dostarget/i586-rust_dos/debug/rust_dos(debug模式)或target/i586-rust_dos/release/rust_dos(release模式)。 - 直接指向已编译的二进制文件运行
cargo nm:
如果你已经安装了对应架构的交叉编译binutils(比如cargo nm --target i586-rust_dos.json --bin target/i586-rust_dos/debug/rust_dos --verbosei586-elf-nm),也可以直接用原生nm工具:i586-elf-nm target/i586-rust_dos/debug/rust_dos
方法二:用自定义脚本简化流程
如果需要频繁执行这个操作,可以写一个简单的shell脚本(比如cargo-xnm.sh)来自动完成编译+分析的流程:
#!/bin/bash # 先执行xbuild编译 cargo xbuild --target i586-rust_dos.json --bin rust_dos # 调用cargo nm分析生成的二进制 cargo nm --target i586-rust_dos.json --bin target/i586-rust_dos/debug/rust_dos "$@"
给脚本添加执行权限:
chmod +x cargo-xnm.sh
之后直接运行./cargo-xnm.sh --verbose就能完成整个流程。
额外注意
确保你已经安装了cargo-xbuild工具,如果还没装,先执行:
cargo install cargo-xbuild
内容的提问来源于stack exchange,提问作者Mizunashi
相关产品推荐
相关产品推荐

