2012-09-02 12 views
5

Ich verwende immer den file Befehl, um den Dateityp zu überprüfen, meistens nachdem ich ein neues Projekt kompiliert habe, um sicherzustellen, dass alles in Ordnung ist.Linux Befehl "Datei" zeigt "für GNU/Linux 2.6.24"

Der Ausgang ist so etwas wie dies unter:

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

Meine Frage ist mein Linux Kernel da zu 3.0+ aktualisiert wird, warum immer noch funktioniert es zeigt es für ältere Versionen von Linux kompiliert wird?

for GNU/Linux 2.6.24 

Ist es etwas zu file Befehl verwandt oder muss ich etwas tun, um mein Projekt gegen neueren Linux-Kernel zu kompilieren?

Dank

+0

Welche Version der Linux-Header befinden sich in '/ usr/src/linux'? – robert

+0

Die Ausgabe des Compilers hängt nicht von der Kernel-Version ab, die Sie verwenden. Es hängt nur von dem Compiler ab, den Sie verwenden. –

+0

Es scheint, ich habe verschiedene Versionen von Linux hier: Mahdi @ XO0PS: ~ $ ls/usr/src/| grep Linux linux-headers-2.6.38-14 linux-headers-2.6.38-14-generic-pae linux-headers-2.6.38-8 linux-headers-3.2.0-23 linux-headers -3.2.0-23-generic linux-headers-3.2.0-24 linux-headers-3.2.0-24-generische linux-headers-3.2.0-26 linux-headers-3.2.0-26-generische linux-headers-3.2.0-27 linux-headers-3.2.0-27-generic linux-headers-3.2.0-29 linux-headers-3.2.0-29-generic – mahdi

Antwort

9

Die Kernelversion, die von Datei auf einer ausführbaren Datei angezeigt wird, hat nichts mit dem Kernel zu tun, der auf Ihrem System installiert ist. Es stimmt mit der C-Bibliothek überein, mit der das Programm zur Build-Zeit verbunden war.

Ihr C-Compiler zielt auf eine bestimmte C-Bibliothek ab (normalerweise glibc). Die C-Bibliothek zielt wiederum auf eine Kernel-API ab (d. H. Die C-Bibliothek ist für einen bestimmten Kernel gebaut). Das ist die Version, die von Datei angezeigt wird.

Sie müssen sich keine Gedanken über den Mimatch zwischen der Kernel-Version von Datei und der auf Ihrem Computer installierten Kernel-Version machen.

@REALFREE: Sie können das folgende Experiment versuchen. Vielleicht wird es helfen Ihnen ein Verständnis von dem, was vor sich geht:

 
$ uname -r 
3.10-2-amd64 
$ gcc -Wall -Werror hello.c -o hello 
$ readelf --notes ./hello 
Displaying notes found at file offset 0x0000021c with length 0x00000020: 
    Owner     Data size  Description 
    GNU     0x00000010  NT_GNU_ABI_TAG (ABI version tag) 
    OS: Linux, ABI: 2.6.32 

Die Informationen über den ABI-Tag in einem elf Segment enthalten ist HINWEIS genannt. Diese Information wird vom Linker geschrieben, wenn das Programm kompiliert wird. Es entspricht dem ABI-Tag der C-Bibliothek.

 
$ ldd ./hello 
     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 
Displaying notes found at file offset 0x00000294 with length 0x00000020: 
    Propriétaire  Taille des données  Description 
    GNU     0x00000010  NT_GNU_ABI_TAG (étiquette de version ABI) 
    OS: Linux, ABI: 2.6.32 

Um die C-Bibliothek zu bauen, haben Sie einen Kernel Version auszuwählen. Hier wurde die C-Bibliothek für einen 2.6.32-Kernel kompiliert, aber funktioniert auch mit neueren Kernen. Wenn jedoch das Programm auf einem Kernel älter als 2.6.32 ausgeführt wird, wird ein Kernel zu alt Warnung wird angezeigt.

+0

Danke. Es ist eine vollständige Information, die Sie bereitstellen. – mahdi

+0

Ich habe mich gefragt, warum sie anders sind? Ich stieß auf die gleiche Situation, dass kompilierte Datei 2.6.24 verwendet, aber Kernel-Version auf dem Computer installiert ist 3.2.0-52 – REALFREE

2

Das Versionsnummer auf die Kernel-Header von denen auf dem Host gebaut die glibc-C-Bibliothek verweist, die die Compiler auf ausgeführt wurde. Im Allgemeinen wird die Kernel-Ebene angezeigt, die von der ausführbaren Datei erwartet wird.

+0

Danke. Es hängt also mit den Bibliotheken zusammen, die ich in meinem Projekt verwende, und ich habe hier nichts zu ändern. – mahdi