加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:51:12 所属栏目:Windows 来源:网络整理
导读:构建Rust二进制文件(可执行文件或dylib)时,Cargo.toml中配置的版本信息对构建的二进制文件没有影响,这意味着配置的版本不会存储在二进制文件中. 在Linux中,当我使用readelf -V作为.so文件时,您可以看到支持的接口(SO Name)存储在ELF文件的Version definition
构建Rust二进制文件(可执行文件或dylib)时,Cargo.toml中配置的版本信息对构建的二进制文件没有影响,这意味着配置的版本不会存储在二进制文件中.

在Linux中,当我使用readelf -V作为.so文件时,您可以看到支持的接口(SO Name)存储在ELF文件的Version definition部分’.gnu.version_d’下.例如,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也没有版本信息.也许这是另一个问题,但我想我先提出这个问题.

解决方法

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读