12.1 #[panic_handler]
自定义 panic 处理函数
2 分钟阅读
译文 · 基于 The Rustonomicon
本节记录通常由 std crate 提供、而 #![no_std] 开发者必须自行处理(即提供)以构建 #![no_std] 二进制 crate 的功能。
libc 要构建 #[no_std] 可执行文件,需要把 libc 作为依赖。可在 Cargo.toml 中指定:
| |
注意默认特性已禁用。这是关键一步——libc 的默认特性包含 std crate,必须禁用。
或者,可使用不稳定的 rustc_private 私有特性,配合 extern crate libc;,如下例。注意 windows-msvc 目标不需要 libc,其 sysroot 中也没有 libc crate。下面不需要 extern crate libc;,在 windows-msvc 目标上写它会编译错误。
std 的可执行文件 构建 #![no_std] 可执行文件可能需要 nightly 编译器,因为在许多平台上必须提供 eh_personality lang item,它是不稳定的。
需要为入口点定义适合目标的符号。例如 main、_start、WinMain,或目标相关的其他起点。此外要用 #![no_main] 属性,防止编译器自行生成入口点。
还必须定义 panic 处理函数。
| |
若目标没有通过 rustup 提供标准库二进制发布(可能意味着你在自行构建 core crate),且需要 compiler-rt 内建函数(即构建可执行文件时出现链接错误:undefined reference to `__aeabi_memcpy'),需要手动链接 compiler_builtins crate 以获取这些内建函数并解决链接错误。
自定义 panic 处理函数