gpt4 book ai didi

rust - 将 Cargo 与自定义链接器一起使用

转载 作者:行者123 更新时间:2023-11-29 08:30:08 29 4
gpt4 key购买 nike

我想使用 cargo 构建需要自定义编译的项目(调用汇编器、链接器……)。

我可以用一个构建脚本来做到这一点,但它并不完美。例如,从这个 tutorial 构建代码,我制作了以下构建脚本:

use std::fs::create_dir;
use std::process::Command;

fn main() {
build();
link();
iso();
}

fn build() {
Command::new("cargo")
.current_dir("uefi_app")
.args(&["rustc", "--", "--emit", "obj"])
.status().unwrap();
}

fn iso() {
let disk_file = "target/debug/disk.img";
let disk_dir = "target/debug/disk";
let efi_boot = disk_dir.to_owned() + "/efi/boot";
let copy_dest = efi_boot.clone() + "/bootx64.efi";

let dd_of = "of=".to_owned() + disk_file;
Command::new("dd")
.args(&["if=/dev/zero", &dd_of, "bs=512", "count=93750"])
.status().unwrap();

Command::new("parted")
.args(&[disk_file, "-s", "-a", "minimal", "mklabel", "gpt"])
.status().unwrap();

Command::new("parted")
.args(&[disk_file, "-s", "-a", "minimal", "mkpart", "EFI", "FAT16", "2048s", "93716s"])
.status().unwrap();

Command::new("parted")
.args(&[disk_file, "-s", "-a", "minimal", "toggle", "1", "boot"])
.status().unwrap();

Command::new("sudo")
.args(&["losetup", "--offset", "1048576", "--sizelimit", "46934528", "/dev/loop0", disk_file])
.status().unwrap();

let _ = create_dir(disk_dir);

Command::new("sudo")
.args(&["mkdosfs", "-F", "32", "/dev/loop0"])
.status().unwrap();

Command::new("sudo")
.args(&["mount", "/dev/loop0", disk_dir])
.status().unwrap();

Command::new("sudo")
.args(&["mkdir", "-p", &efi_boot])
.status().unwrap();

Command::new("sudo")
.args(&["cp", "target/debug/boot.efi", &copy_dest])
.status().unwrap();

Command::new("sudo")
.args(&["umount", disk_dir])
.status().unwrap();

Command::new("sudo")
.args(&["losetup", "-d", "/dev/loop0"])
.status().unwrap();

Command::new("sudo")
.args(&["rm", "-R", disk_dir])
.status().unwrap();
}

fn link() {
Command::new("x86_64-efi-pe-ld")
.args(&["--oformat", "pei-x86-64", "--subsystem", "10", "-pie", "-e", "efi_main", "uefi_app/target/debug/uefi_app.o", "-o", "target/debug/boot.efi"]).output().unwrap();
}

您可以看到完整的箱子 here .

另一个例子是this crate来自 here 的操作系统教程.

这需要一个单独的箱子,因为在构建脚本中运行 cargo 似乎会触发无限循环。

这个构建脚本的问题是每次我更新由构建脚本编译的 crate 的代码时,我都需要运行 cargo clean

我如何使用 cargo 来自动执行这样的编译?

我想要的只是键入 cargo run 并获取 ISO(或硬盘驱动器文件)并启动 VM。

最佳答案

您可以在 .cargo/config 文件中指定自定义链接器。 See this举个例子:

[target.thumbv7em-none-eabi]
linker = "arm-none-eabi-gcc"
ar = "arm-none-eabi-ar"

关于rust - 将 Cargo 与自定义链接器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403155/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com