我正在尝试用 Rust 创建一个编译器。我现在想使用此命令将输出的目标文件链接到可执行文件
ld test.o -o test
。当我在 shell 中手动运行此命令时,它总是有效。不过,当我让 rust 这样做时,它有时会起作用,有时会出现此错误:ld: warning: cannot find entry symbol _start; not setting start address
这确实是 50/50,我不知道是什么原因造成的。
这就是我运行命令的方式:
process::Command::new("ld")
.arg(format!("{}.o", outputfile))
.arg("-o")
.arg(&outputfile)
.spawn()
.expect("Failed to link");
我尝试通过打印如下命令来检查 rust 实际运行的内容来调试此问题:
println!(
"{:?}",
process::Command::new("ld")
.arg(format!("{}.o", outputfile))
.arg("-o")
.arg(&outputfile)
);
这将打印出:
"ld" "test.o" "-o" "test"
,我直接将其复制到我的外壳中,没有任何问题。
这很奇怪,我已经尝试解决这个问题太久了。如果您知道可能导致此问题的原因,请帮忙。
编辑: 如果您需要任何额外信息来提供帮助,您可以在我的 GitHub 上找到所有代码:https://github.com/sten-code/rlangc 问题出在构建函数内部
main.rs
底部的代码上。
请注意,我昨天开始学习 Rust,所以代码可能很糟糕。
问题是我在链接器命令之前运行了 nasm 命令。链接器依赖于 nasm 命令的输出。 Rust 中的
Command::spawn
异步运行命令,因此当我运行链接器命令时,有 50% 的机会 nasm 命令未完成创建目标文件,从而导致崩溃。感谢@cafce25向我指出了这一点。