有没有办法将版本信息存储在Rust编译的可执行文件或库中?

时间:2016-01-05 03:18:49

标签: dll rust versioning rust-cargo

构建Rust二进制文件(可执行文件或dylib)时,Cargo.toml中配置的版本信息对构建的二进制文件没有影响,这意味着配置的版本不会存储在二进制文件中。

在Linux中,当我使用readelf -V作为.so文件时,您可以看到支持的界面(SO名称)存储在版本定义部分' .gnu.version_d&#39下; 的ELF文件。例如,readelf -V /lib/libnss_files-2.12.so的输出:

Version definition section '.gnu.version_d' contains 2 entries:
   Addr: 0x0000000000001540  Offset: 0x001540  Link: 5 (.dynstr)
   000000: Rev: 1  Flags: BASE   Index: 1  Cnt: 1  Name: libnss_files.so.2
   0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: GLIBC_PRIVATE

/lib/libnss_files-2.12.so文件正在实现接口版本libnss_files.so.2

Rust或Cargo生成的dylib或可执行文件的readelf -V输出没有此类版本信息。 Cargo.toml中的版本配置仅由crates.io使用。

此外,Windows DLL支持存储版本信息,而不是像Linux那样的SONAME接口版本名称。交叉编译的Windows DLL也没有版本信息。也许这是另一个问题,但我想我首先提出这一点。

2 个答案:

答案 0 :(得分:2)

虽然我认为没有直接的方法可以使用ELF工具进行版本控制(但它们不是跨平台的),但可以使用Cargo的版本信息:

const VERSION: &'static str = env!("CARGO_PKG_VERSION");

VERSION现在将等于运行cargo build时清单中指定的版本。或者,如果您想在没有货物的情况下构建程序,则可以使用env_opt!()

const VERSION: Option<&'static str> = env_opt!("CARGO_PKG_VERSION");

答案 1 :(得分:1)

使用 winres(https://github.com/mxre/winres) 可以将 CARGO_PKG_VERSION 设置为 dll 文件版本,也许对其他人有帮助