使用Rust的no_std模式 + 内联汇编 + 自定义链接脚本,可以将”Hello World”程序压缩到173字节
成果对比:
- 标准Rust编译:~1.5MB
- rustc优化后:384字节
- sstrip处理后:173字节
源代码(mini.rs)
直接用汇编实现系统调用,绕过所有Rust运行时:
1 |
|
关键点:
global_asm!直接内联汇编,无Rust代码生成开销xor rdi, rdi比mov rdi, 0省1字节panic_handler虽然不会被调用,但Rust要求必须提供
链接脚本(mini.ld)
自定义链接脚本,精确控制ELF布局:
1 | OUTPUT_FORMAT("elf64-x86-64") |
优化点:
- 只创建一个
PT_LOADsegment(默认有多个) /DISCARD/丢弃所有调试信息、栈标记、注释等非运行时必需段
编译命令
1 | rustc +nightly mini.rs -o test \ |
参数说明:
-C opt-level=z:优化体积而非速度-C lto=fat:全程序链接时优化-nostartfiles:不链接C运行时--build-id=none:不生成build-id-z,norelro:禁用RELRO(重定位只读保护)-n:禁用页面对齐-Tmini.ld:使用自定义链接脚本
进一步优化
使用 sstrip 移除编译器元数据(rustc版本、链接器信息等):
1 | sstrip test # 从384字节降至173字节 |
工具地址:https://github.com/BR903/ELFkickers
运行测试
编译后直接运行:
1 | ./test |
查看文件大小:1
2
3ls -lh test
# 384字节(rustc编译后)
# 173字节(sstrip处理后)
- 本文作者: killf
- 本文链接: https://www.killf.info/编程语言/Rust/极致的RUST-汇编/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!