#parser #pub #artifact #export #extern #extracting #mangle

no_mangle_pub_export_c_fn

一个用于提取#[no_mangle] pub extern "C"函数的库

3个版本

0.1.2 2021年12月25日
0.1.1 2021年12月24日
0.1.0 2021年12月24日

#165 in FFI

MIT/Apache

39KB
91

一个用于提取#[no_mangle] pub extern "C"函数的库

为了公开具有C二进制接口的函数以与其他编程语言进行互操作,Rust开发者应使用#[no_mangle]属性并指定声明的函数的ABI。

#[no_mangle]
pub extern "C" fn func_name () /* -> ... */ {
    // ...
}

您可以在此处了解更多信息

此库允许通过syn驱动的解析来获取这些无mangle-pub-extern-C函数的位置信息。

示例

main.rs

use no_mangle_pub_export_c_fn::{parse_for_no_mangle_pub_extern_c_fns, ParsedFile};

fn main() {
    let crate_root = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let parsed_files: Vec<ParsedFile> = parse_for_no_mangle_pub_extern_c_fns(crate_root.as_str());
    println!("{:#?}", parsed_files);
}

unused.rs

#[no_mangle]
pub extern "C" fn s() {
    // test
}

Windows上的输出

[
ParsedFile {
    path: "...\\no_mangle_pub_export_c_fn\\src\\lib.rs",
    no_mangle_pub_export_c_fns: NoManglePubExportCFns {
        no_mangle_pub_export_c_fn_vec: [],
    },
},
ParsedFile {
    path: "...\\no_mangle_pub_export_c_fn\\src\\main.rs",
    no_mangle_pub_export_c_fns: NoManglePubExportCFns {
        no_mangle_pub_export_c_fn_vec: [],
    },
},
ParsedFile {
    path: "...\\no_mangle_pub_export_c_fn\\src\\unused.rs",
    no_mangle_pub_export_c_fns: NoManglePubExportCFns {
        no_mangle_pub_export_c_fn_vec: [
            NoManglePubExportCFnEnds {
                start_line: 1,
                start_column: 0,
                end_line: 4,
                end_column: 1,
            },
        ],
    },
},
]

序列化和反序列化

此库中的所有结构都实现了SerializeDeserialize traits,来自serde。因此,您可以将数据转换为支持serde的多种数据格式。

数据格式

  • JSON,许多HTTP API使用的通用JavaScript对象表示法。
  • Bincode,Servo渲染引擎内用于IPC的紧凑二进制格式。
  • CBOR,专为小型消息大小而设计的紧凑二进制对象表示法,无需版本协商。
  • YAML,一种自称为人类友好的配置语言,但并非标记语言。
  • MessagePack,类似于紧凑JSON的高效二进制格式。
  • TOML,Cargo使用的最小配置格式。
  • Pickle,在Python世界中常见的格式。
  • RON,一种Rusty对象表示法。
  • BSON,MongoDB使用的用于数据存储和网络传输的格式。
  • Avro,Apache Hadoop内部使用的二进制格式,支持模式定义。
  • JSON5,包括ES5中一些生产内容的JSON超集。
  • Postcard,一种无_std和面向嵌入式系统的紧凑型二进制格式。
  • URL查询字符串,采用x-www-form-urlencoded格式。
  • Envy,一种将环境变量反序列化为Rust结构体的方法。(仅限反序列化)
  • Envy Store,一种将AWS参数存储参数反序列化为Rust结构体的方法。(仅限反序列化)
  • S-expressions,Lisp语言家族使用的代码和数据文本表示。
  • D-Bus的二进制线格式。
  • FlexBuffers,Google的FlatBuffers零拷贝序列化格式的无模式表亲。
  • DynamoDB Itemsrusoto_dynamodb用于将数据传输到和从DynamoDB的格式。

许可证

根据您的选择,在Apache License,Version 2.0或MIT许可证下许可。
除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交以包含在此crate中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖项

~0.5–8MB
~61K SLoC