可执行文件上的文件显示的内核版本与系统上安装的内核无关。它与程序在构建时链接的 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 的内核上运行,则会显示内核太旧警告。