linux文件命令输出中的版本号字段是什么

问题描述 投票:0回答:2

如果我对在 Fedora Core 11 上编译的名为“version”的可执行文件执行以下命令,我会得到以下输出

文件版本

版本:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.18,未剥离

末尾的 2.6.18 数字有何意义?它对于区分客户应该下载某个软件的版本有什么用?

从我目前所看到的来看,这个数字绝对不是

  1. 内核版本
  2. libc版本
  3. 与 lsb_release 有关的任何事情

我想获得一些简单的标识符,以允许客户知道他们应该下载哪个二进制版本,理想情况下他们应该能够通过键入命令来识别该命令(例如 uname -a,尽管这显然不是此中的命令)案例)。

谢谢

linux version release glibc
2个回答
7
投票

它是二进制文件被编译的机器的内核版本。如果您使用发行版中的预编译二进制文件,则它是发行版供应商的机器的内核版本,可能位于其编译场中。

这是相关的,例如在考虑系统调用时。假设您的二进制文件使用系统调用号。

X
并且您使用的内核尚不支持
X
,或者更糟糕的是已分配了系统调用号。
X
到不同的系统调用。

普通的 Linux 内核用户 API 是稳定的。这意味着 Linux 版本

A
中可用的每个系统调用也可以在 Linux 版本
B
中使用,前提是
A <=B
。但可能会发生一些开发人员发布他/她自己的 Linux 开发版本(类似于
linux-2.6.18-xy
)并且他/她实现了一个新的系统调用。如果他/她现在使用该内核版本编译二进制文件,则该二进制文件将被标记为该版本。因此,您稍后可以知道它可能有效也可能无效。

顺便说一句,

/usr/include/asm/unistd_32.h
包含系统调用号,摘录:

[...]
#define __NR_restart_syscall      0
#define __NR_exit         1
#define __NR_fork         2
#define __NR_read         3
#define __NR_write        4
#define __NR_open         5
[...]

0
投票

“file”命令输出中显示的内核版本取自名为“.note.ABI-tag”的 ELF(Linux 上常见的可执行文件格式)部分。它不是由内核定义的,而是由编译程序的 GNU libc 定义的。

此处的数字定义了 C 库至少期望的 Linux 内核 API 级别(支持的系统调用),并在 crt1.o 的 .note.ABI-tag 部分中定义,启动对象静态链接到每个可执行文件。详情请参阅其规格

虽然 Johannes Weiss 普遍认为 API 是稳定的(并且向后兼容)是正确的,但提供新功能的新接口会定期实现。最新的主要 API(截至 2024 年)将是用于 32 位系统(例如 ARM 32)的 64 位时间 API,在 Linux 内核 5.15.0 中引入,并与 GNU libc 2.34 及更高版本一起使用,在我们使用后将需要它。 2038 年达到 UNIX 时间的 2^31 秒。

© www.soinside.com 2019 - 2024. All rights reserved.