如何让Rust bindgen生成带hidden可见性的C函数绑定?
问题背景
使用rust-bindgen为静态链接的第三方C库生成Rust绑定时,发现被__attribute__((visibility("hidden")))修饰的函数不会被默认生成绑定,但静态链接场景下这些函数实际可访问,且无法修改第三方头文件。
示例C头文件header.h:
__attribute__((visibility("hidden"))) void f_hidden(); __attribute__((visibility("default"))) void f_default();
执行bindgen header.h生成的Rust代码仅包含默认可见性的函数:
/* automatically generated by rust-bindgen 0.66.1 */ extern "C" { pub fn f_default(); }
解决方法
可以通过以下几种方式配置bindgen,使其生成hidden属性函数的绑定:
1. 命令行指定允许列表
直接在bindgen命令中通过--allowlist-function参数指定需要生成的hidden函数,支持精确匹配或正则通配:
# 生成单个hidden函数的绑定 bindgen header.h --allowlist-function "f_hidden" # 生成所有函数的绑定(包含hidden属性的) bindgen header.h --allowlist-function ".*"
2. 构建脚本(build.rs)配置
如果使用build.rs管理绑定生成,可通过bindgen::Builder的allowlist_function方法添加规则:
use bindgen::Builder; use std::path::PathBuf; fn main() { let bindings = Builder::default() .header("header.h") // 允许单个hidden函数 .allowlist_function("f_hidden") // 或者允许所有函数(按需选择) // .allowlist_function(".*") .generate() .expect("生成绑定失败"); let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_dir.join("bindings.rs")) .expect("写入绑定文件失败"); }
3. 全局禁用符号隐藏
使用--no-hide-function-names参数强制bindgen不忽略任何函数符号(包括hidden属性的),但会生成所有函数,需谨慎使用:
bindgen header.h --no-hide-function-names
内容的提问来源于stack exchange,提问作者Gottox
相关产品推荐
相关产品推荐

