Linux kernel 如何确定Linux内核的构建/版本';uImage';?

Linux kernel 如何确定Linux内核的构建/版本';uImage';?,linux-kernel,Linux Kernel,我正试图找到一个内核二进制文件有没有办法确定Linux“uImage”二进制文件的版本(生成字符串)? 运行 strings uImage 通过各种拖尾grep语句,我认为我正在处理一个压缩图像…我不确定您是否可以尝试uname-a这可能是您想要的。尝试文件uImage。如果文件格式是一种常见的压缩格式,它可能会识别该文件格式。除此之外,strings实用程序可能是执行此任务的最佳工具。我刚刚意识到,我可以立即访问的内核将版本字符串存储在未压缩的标题中字符串(uImage | grep2.6应

我正试图找到一个内核二进制文件有没有办法确定Linux“uImage”二进制文件的版本(生成字符串)?

运行

strings uImage

通过各种拖尾
grep
语句,我认为我正在处理一个压缩图像…

我不确定您是否可以尝试
uname-a
这可能是您想要的。

尝试
文件uImage
。如果文件格式是一种常见的压缩格式,它可能会识别该文件格式。除此之外,
strings
实用程序可能是执行此任务的最佳工具。

我刚刚意识到,我可以立即访问的内核将版本字符串存储在未压缩的标题中<代码>字符串(uImage | grep2.6应该足够适合任何2.6内核,它在过去5年多的时间里几乎涵盖了所有内容)

(原答覆如下)


这在理论上是可能的,但并不完全是微不足道的

现代Linux内核版本使用一种称为bzImage的格式(对于x86/x86_64,在其他平台上使用YMMV)。它实际上包括一个ELF头和一些其他细节(比如一点解压缩代码),然后是一个实际内核的压缩图像

传统上,压缩算法是zlib(与流行的误解相反,“bzImage”并不代表“bzipped image”,而是代表“big zImage”——原始zImage格式无法处理大内核),尽管2.6.30之后的版本也支持bzip2和LZMA


您可能需要做的是准确地确定压缩数据的起始位置(抱歉,在这方面无法帮助您,但尝试和错误可能会起作用),然后编写一些代码,在库中运行它,以使用任何一种压缩算法。

如果它是x86的内核,则它的标题中有版本。请参阅(查看
kernel\u version
字段)


我不知道其他体系结构是否也是如此(该头是x86特有的)。

根据内核的格式规范,以下是C代码:

kver.c
要了解编译的Linux版本,请在未压缩的vmlinux映像上使用
strings
实用程序

例如:

strings-linux-src/build/build-generic/vmlinux | grep“linux版本”

样本输出:


Linux版本3.2.0-56-generic(root@puerto-cayo)(gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5))#86 SMP Fri Nov 1 10:24:18 EDT 2013(Ubuntu 3.2.0-56.86-generic 3.2.51)

这将在bzimage上输出内核版本和本地版本字符串(如果在构建时设置):

 strings bzimage |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
我已经在内核版本3和4上测试过了。。。但它也应该适用于以前的版本

strings vmlinuz |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
4.4.5
strings vmlinux |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
3.2.45-smp
如果有uImage,则必须删除“^”,否则它将不匹配任何内容

strings uImage |grep -E "[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |head -1
Linux-3.0.76

它给出了主机环境的构建字符串;我正在查看一个内核映像的内部,该映像已存储为
uImage
文件。感谢您的回复。当尼古拉斯·奈特(Nicholas Knight)在2-1/2年前回答同样的问题时,这是如何得到支持的?这个答案不需要思考,因此更好。:-)谢谢你!不幸的是,对于4.19内核,它不适用于我。规格最近有变化吗<代码>kver针对该vmlinux,只输出
\n
,但不输出内容。
strings vmlinuz |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
4.4.5
strings vmlinux |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
3.2.45-smp
strings uImage |grep -E "[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |head -1
Linux-3.0.76