写 rustc 的 codegen backend 时,关键导出符号是 __rustc_codegen_backend——rustc 通过 dlopen 加载 backend 动态库,会按这个名字找入口函数。所以 backend 编完,第一件事是验证这个符号有没有以全局函数的形式导出。
两步搞定。
1. 导出符号表
nm -D crates/rustc-codegen-cuda/target/debug/librustc_codegen_cuda.so \
> docs/rustc-codegen-cuda-table.md
-D 看的是动态符号表(dynsym),即动态链接器在 dlopen 时能看到的那一份——和 -a 全表区别开。
2. grep 找目标符号
grep __rustc_codegen_backend docs/rustc-codegen-cuda-table.md
输出:
0000000001d2c820 T __rustc_codegen_backend
T 表示代码段中的全局函数——正是我们想要的导出形式。
如果出现这些情况要回查
| 看到的 | 含义 | 通常原因 |
|---|---|---|
| 这一行不存在 | 符号没编进去 | #[no_mangle] 漏了、或函数被 dead-code 干掉 |
t __rustc_codegen_backend(小写) | 局部符号,不导出 | 缺 pub 或没用 extern "Rust" |
U __rustc_codegen_backend(未定义) | 引用但没定义 | backend crate 编错了,符号在别处 |
只有看到大写 T 才算 OK。
nm 输出的各种字母含义,见 nm 符号类型速查。
评论区
评论功能即将上线, 敬请期待。