使用 Rust 从零写一个可执行程序
让我们假设我们想为 x86_64 的 Linux 制作一个二进制文件,它应该是非常便携的。它期望能在 Debian 和Arch Linux 上工作。它应该能在没有 glibc 的系统上工作,比如 Alpine Linux。它甚至应该在 FROM scratch Docker 容器中工作。在一个更严肃的环境中,你会把 musl-libc 和你的 Rust 程序静态连接起来,但今天我们要尝试在没有libc 的情况下工作。我们还将使用Rust,更确切地说,是 Rust 的稳定版,所以这篇博文不会使用 任何夜间版的功能。如果你使用的是 Rust 1.0 版本或更高版本(根据我的电脑,>=1.68.0),你应该可以很好地尝试这个方法。
最终代码:
#![no_std]
#![no_main]
use core::arch::asm;
use core::arch::global_asm;
use core::panic::PanicInfo;
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
exit(1);
}
global_asm! {
".global _start",
"_start:",
"mov rdi, rsp",
"call main"
}
fn exit(status: i32) -> ! {
unsafe {
asm!(
"syscall",
in("rax") 60,
in("rdi") status,
options(noreturn)
);
}
}
unsafe fn write(fd: i32, buf: *const u8, count: usize) -> isize {
let r0;
asm!(
"syscall",
inlateout("rax") 1isize => r0,
in("rdi") fd,
in("rsi") buf,
in("rdx") count,
lateout("rcx") _,
lateout("r11") _,
options(nostack, preserves_flags)
);
r0
}
#[no_mangle]
unsafe fn main(_stack_top: *const u8) -> ! {
write(1, b"Hello world\n".as_ptr(), 12);
exit(0);
}
编译方式:
$ cargo build --release --target x86_64-unknown-none
ReadMore: https://vulns.xyz/2023/03/linux-executable-from-scratch-with-x86_64-unknown-none-rust/
Zig and Rust
作者从多个方面阐述了对 Zig 和 Rust 这两门语言的看法,最终总结来看
- Rust是关于组合安全的,它是一种比 Scala 更可扩展(scalable)的语言。
- Zig是关于完美的。它是一个非常 Sharp、危险,但更灵活的工具。
ReadMore: https://matklad.github.io/2023/03/26/zig-and-rust.html
Rust Search Extension v1.10.0 发布
ReadMore: https://rust.extension.sh/changelog/#v1-10-0-2023-03-25
From 日报小组 Koalr
社区学习交流平台订阅:
评论区
写评论rust 1.68.2发布了~