< 返回版块

Koalr 发表于 2023-03-29 17:34

Tags:rust,日报

使用 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

社区学习交流平台订阅:

评论区

写评论
RedPanda 2023-03-29 20:23

rust 1.68.2发布了~

1 共 1 条评论, 1 页