9

我总是使用file命令来检查文件类型,主要是在我编译一个新项目以确保一切正常之后。

输出类似于以下内容:

proj_out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=0x23d9f966854e09d721c6110d505247483dae02fe, stripped

我的问题是,既然我的 Linux 内核更新到 3.0+,为什么它仍然显示它是为旧版本的 Linux 编译的?

for GNU/Linux 2.6.24

它是否与命令相关,file或者我必须做任何事情来针对较新的 Linux 内核编译我的项目?

谢谢

4

2 回答 2

13

可执行文件上的文件显示的内核版本与系统上安装的内核无关。它与程序在构建时链接的 C 库相匹配。

您的 C 编译器针对特定的 C 库(通常是 glibc)。反过来,C 库以内核 API 为目标(即 C 库是为特定内核构建的)。即file显示的版本。

您不必担心文件显示的内核版本与您机器上安装的内核版本不匹配。

@REALFREE:您可以尝试以下实验。也许它会帮助您了解正在发生的事情:

$ unname -r
3.10-2-amd64
$ gcc -Wall -Werror hello.c -o hello
$ readelf --notes ./你好
显示在文件偏移量 0x0000021c 处找到的注释,长度为 0x00000020:
  所有者 数据大小 描述
  GNU 0x00000010 NT_GNU_ABI_TAG(ABI 版本标签)
    操作系统:Linux,ABI:2.6.32

关于ABI 标签的信息包含在一个名为NOTE的 elf 段中。该信息由链接器在程序编译时写入。它与 C 库的 ABI 标记匹配。

$ ldd ./你好
        linux-vdso.so.1 (0x00007fffd31fe000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5f1a465000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5f1a827000)
$ readelf --notes /lib/x86_64-linux-gnu/libc.so.6
显示在文件偏移 0x00000294 处找到的注释,长度为 0x00000020:
  Propriétaire Taille des données 描述
  GNU 0x00000010 NT_GNU_ABI_TAG(ABI 版礼仪)
    操作系统:Linux,ABI:2.6.32

为了构建 C 库,您必须选择一个内核版本。在这里,C 库是为 2.6.32 内核编译的,但它也适用于更新的内核。但是,如果程序在早于 2.6.32 的内核上运行,则会显示内核太旧警告。

于 2012-09-02T13:43:20.740 回答
3

该版本号指的是在运行编译器的主机上构建 glibc C 库的内核头文件。从广义上讲,它显示了可执行文件将支持的内核级别。

于 2012-09-02T13:34:25.780 回答