2017-08-04 80 views
0

我正在Linux上为某些嵌入式设备构建Qt/C +应用程序,我想从二进制ELF文件中读取应用程序的版本。二进制文件不会被剥离并用GCC编译。如何从二进制文件中获取应用程序的版本号?

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

谢谢。

+0

[ELFIO - 用于读取和生成ELF文件的C++库](http://elfio.sourceforge.net/) –

+2

每个应用程序开发人员在应用程序二进制文件中都有不同的应用程序版本记录方式,因此它可能很长用于读取所有在ELF文件中查找版本信息的字符串或数字的二进制文件。 – AmeyaVS

回答

0

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

$ kate --version 
kate 15.12.3 
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 

现在的设备上运行的任何程序都可以平凡找到合适的版本信息,而不必从二进制提取它。

+0

有趣,感谢分享。事实上,我在某个时候创建​​了一个fs,我试图减少与软件管理相关的额外脚本或文件的数量,特别是如果这些数据可以直接从二进制文件中提取。 – Scab

+0

@Scab“减少额外的脚本”只有在降低总体复杂性时才有意义。添加可以在运行时崩溃的不重要数量的C代码,以移除无法失败的普通shell脚本是没有意义的。 –

相关问题