如何从二进制文件中获取应用程序的版本号?

Posted

技术标签:

【中文标题】如何从二进制文件中获取应用程序的版本号?【英文标题】:How to get the version number of an application from the binary file? 【发布时间】:2017-08-04 11:01:27 【问题描述】:

我正在 Linux 上为一些嵌入式设备构建 Qt/C+ 应用程序,我想从二进制 ELF 文件中读取应用程序的版本。二进制文件没有被 GCC 剥离和编译。

有没有办法构建一个可执行文件,其他一些程序可以简单地读取它来获取应用程序的版本?

谢谢。

【问题讨论】:

ELFIO - C++ library for reading and generating ELF files 每个应用程序开发人员都会有不同的方式在应用程序二进制文件中记录应用程序版本,因此读取所有二进制文件在 ELF 文件中查找版本的字符串或数字可能是一个漫长的过程信息。 【参考方案1】:

有没有办法构建一个可执行文件,其他程序可以简单地读取它来获取应用程序的版本?

这可以吗?绝对!

应该这样做吗?应该不会吧。

其中一种更简单的方法是:将应用程序版本放入一个文本字符串中,然后使用__attribute__((section("my_app_version"))) 将该字符串定位在您选择的特殊部分中。 Documentation.

观察readelf -x.my_app_version可以提取这个字符串。

现在您所要做的就是复制readelf 所做的事情:读取 ELF 文件头以定位部分,然后读取适当的部分。它需要大量的代码,技术人员可以在几个小时内完成,如果愿意使用帮助库,例如libelf,则可以更快。

那你为什么不这样做呢?

由于您正在构建嵌入式系统,因此在某些时候您可能会创建要闪存到设备中的文件系统映像。

就在创建文件系统的最后一步之前,将一个文本文件放入其中,其中包含所有相关的版本信息。例如,如果您将app1app2 放入图像中,您可以这样做:

VERSIONS=/tmp/rootfs/etc/VERSIONS
rm -f $VERSIONS
echo BuiltBy=$(whoami)@$(hostname)  >> $VERSIONS
echo BuiltOn=$(date) >> $VERSIONS
echo App1=$(/tmp/build/bin/app1 --version) >> $VERSIONS
echo App2=$(/tmp/build/bin/app2 --version) >> $VERSIONS

现在在设备上运行的任何程序都可以轻松找到适当的版本信息,而无需从二进制文件中提取它。

【讨论】:

有趣,谢谢分享。事实上,我在某个时候创建​​了一个 fs,并且我试图减少与软件管理相关的额外脚本或文件的数量,特别是如果这些数据可以直接从二进制文件中提取。 @Scab “减少额外脚本”只有在您降低整体复杂性时才有意义。添加大量可能在运行时崩溃的 C 代码以删除不会失败的琐碎 shell 脚本是没有意义的。【参考方案2】:

一些qt应用程序显示版本,如果你用命令行参数--version运行它,例如

$ kate --version
kate 15.12.3

【讨论】:

以上是关于如何从二进制文件中获取应用程序的版本号?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过静态分析从二进制文件中收集系统调用?

Dask 从二进制文件中读取数据

如何从二进制文件中查找静态分配的大小?

从二进制获取图像尺寸和图像大小

PHP如何将从二进制文件中读取的字节转换为数字

在python中如何从二进制文件中读取信息