我正在Linux上为某些嵌入式设备构建Qt / C +应用程序,我想从二进制ELF文件中读取应用程序的版本。二进制文件不会被GCC剥离和编译。
有没有办法构建一个可以被其他程序简单读取的可执行文件来获取应用程序的版本?
感谢。
答案 0 :(得分:1)
有没有办法构建一个可以被其他程序简单读取的可执行文件来获取应用程序的版本?
可以这样做吗?绝对!
应该这样做吗?可能不是。
执行此操作的更简单方法之一:将应用程序版本放入文本字符串中,并使用__attribute__((section("my_app_version")))
在您选择的特殊部分中找到此字符串。 Documentation
观察readelf -x.my_app_version
可以提取此字符串。
现在你所要做的就是复制readelf
所做的事情:阅读ELF文件标题以找到部分,然后阅读相应的部分。这需要非常少量的代码,技术人员可以在几个小时内完成,或者如果有人愿意使用帮助库,例如libelf,则会更快。
那你为什么不这样做呢?
由于您正在构建嵌入式系统,因此在某些时候您可能会创建要闪存到设备中的文件系统映像。
在创建文件系统的最后一步之前,将一个文本文件放入其中,其中包含所有相关的版本信息。例如,如果您将app1
和app2
放入图片中,则可以执行以下操作:
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
现在,在设备上运行的任何程序都可以轻松找到合适的版本信息,而无需从二进制文件中提取它。
答案 1 :(得分:0)
Some qt application show version, if you run it with command line arg --version
, for example
$ kate --version
kate 15.12.3