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

How to get the version number of an application from the binary file?

本文关键字:应用程序 版本号 获取 二进制文件      更新时间:2023-10-16

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

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

谢谢。

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

这能做到吗?绝对!

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

执行此操作的更简单方法之一:将应用程序版本放入文本字符串中,并使用__attribute__((section("my_app_version")))在您选择的特殊部分中查找此字符串。文档。

观察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

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

某些qt应用程序显示版本,如果您使用命令行arg--version运行它,例如

$ kate --version
kate 15.12.3