ABI

4 文章

静态库、动态库和 ABI

5 分钟

前面几篇讲的是函数级 FFI:extern "C"、字符串、内存归属、回调和 void *ctx。

真正交付给 C 项目时,还要回答另一个问题:

C 工程到底链接什么文件?
头文件声明哪些符号?
这些符号的 ABI 能不能长期稳定?
升级 Rust 代码后,C 侧要不要改?

C 开发者熟悉 .a、.so、.h 和 ABI。Rust 交付给 C 使用时,也要回到这些概念,而不是把 Cargo 内部模型暴露给 C。

阅读更多

结构体和内存布局

5 分钟

C 程序员看 struct,通常会自然想到内存布局:

#include <stdint.h>

struct Header {
    uint8_t version;
    uint32_t length;
    uint16_t flags;
};

字段按声明顺序摆放,中间可能插入 padding,结构体整体也有对齐要求。这个直觉在写协议、文件格式、驱动寄存器映射和 FFI 时很重要。

阅读更多

FFI:让 Rust 调用 C

4 分钟

Rust 调 C,表面上只是多写一段 extern "C" 声明。

真正需要处理的是另一件事:C 函数没有 Rust 的借用、生命周期、Result 和析构规则。Rust 可以调用它,但编译器无法证明这个调用是否满足 C API 的前提。

阅读更多

FFI:让 C 调用 Rust

3 分钟

让 C 调用 Rust,不是把 Rust 函数原样暴露给 C。

C 能理解的是 C ABI:符号名、调用约定、整数、指针、结构体布局、谁分配内存、谁释放内存、错误怎么返回。Rust 内部的 String、Vec、Result、trait、panic,都不应该直接跨过 C 边界。

阅读更多