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 在 无标准库
每月734 次下载
用于 9 个Crates (3直接)
155KB
2.5K SLoC
Origin实现了Linux的程序启动和关闭,以及线程启动和关闭,均采用Rust编写。
Linux的传统程序启动和关闭通常在crt1.o中实现,并使用libc函数exit
、atexit
和_exit
。线程启动和关闭传统上在libpthread函数pthread_create
、pthread_join
、pthread_detach
等中实现。Origin提供了自己的此功能实现,采用Rust编写。
有关此功能的C-ABI兼容接口,请参阅c-scape。
这被Mustang和Eyra在其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