#thread #linux #startup #shutdown #libc #exit #control

nightly 无std origin

Rust编写的程序启动和线程支持

72个版本 (20个重大变更)

0.20.1 2024年8月23日
0.19.0 2024年7月8日
0.18.2 2024年3月2日
0.17.0 2023年12月20日
0.3.0 2021年11月18日

35无标准库

Download history 42/week @ 2024-05-03 41/week @ 2024-05-10 395/week @ 2024-05-17 153/week @ 2024-05-24 66/week @ 2024-05-31 34/week @ 2024-06-07 29/week @ 2024-06-14 36/week @ 2024-06-21 36/week @ 2024-06-28 179/week @ 2024-07-05 32/week @ 2024-07-12 9/week @ 2024-07-19 441/week @ 2024-07-26 56/week @ 2024-08-02 17/week @ 2024-08-09 220/week @ 2024-08-16

每月734 次下载
用于 9 个Crates (3直接)

Apache-2.0…

155KB
2.5K SLoC

Origin

Rust中的程序和线程启动及关闭

Github Actions CI Status zulip chat crates.io page docs.rs docs

Origin实现了Linux的程序启动和关闭,以及线程启动和关闭,均采用Rust编写。

Linux的传统程序启动和关闭通常在crt1.o中实现,并使用libc函数exitatexit_exit。线程启动和关闭传统上在libpthread函数pthread_createpthread_joinpthread_detach等中实现。Origin提供了自己的此功能实现,采用Rust编写。

有关此功能的C-ABI兼容接口,请参阅c-scape

这被MustangEyra在其libc实现中使用,并在Origin Studio项目中的std实现中使用,这是三种不同的方式来支持完全用Rust编写的Rust程序。

示例Crates

Origin还可以独立使用,配置多种方式

  • 基本示例 展示了将Origin用作简单库的简单示例。在此配置中,libc做了大部分工作。

  • 无std示例 使用#![no_std] 并使用Rust的#[start]功能启动程序,然后交由Origin控制。在这里,libc仍然做了大部分工作。

  • “external-start”示例使用#![no_std]#![no_main],并尽可能早地从libc接管控制权,然后将其交给Origin。一旦Origin接管控制权,它就负责程序和线程的启动和关闭。

  • “origin-start”示例使用#![no_std]#![no_main],并让Origin使用其自己的程序入口点来启动程序。Origin负责程序和线程的启动和关闭,不使用任何libc部分。这是Origin Studio使用的方法。

  • “origin-start-no-alloc”示例类似于“origin-start”,但禁用了“alloc”和“thread”功能,因为Origin的“thread”功能目前依赖于“alloc”。在没有“alloc”的情况下,返回所有权的字符串或Vec的函数不可用。在此模式下,Origin完全不使用全局分配器。

  • “origin-start-lto”示例类似于“origin-start”,但使用LTO构建。

  • “tiny”示例类似于“origin-start”,但使用优化标志构建,禁用功能,并添加objcopy技巧以生成一个非常小的二进制文件——x86-64上的408字节!

完全静态链接

“origin-start”、“origin-start-no-alloc”和“origin-start-lto”示例中的生成可执行文件不依赖于任何动态库,然而默认情况下它们仍然依赖于动态链接器。

对于完全静态链接,有两种选择

  • 使用RUSTFLAGS=-C target-feature=+crt-static -C relocation-model=static构建。这禁用了PIE模式,这对Origin的代码来说更安全,但失去了地址空间布局随机化(ASLR)的安全性优势。

  • 使用RUSTFLAGS=-C target-feature=+crt-static并启用Origin的experimental-relocate功能。这允许PIE模式工作,但它通过在Origin中启用一些用于执行重定位的实验性代码来实现。

依赖项

~9–18MB
~330K SLoC