2012-09-02 30 views
5

Tôi luôn sử dụng lệnh file để kiểm tra loại tệp, chủ yếu sau khi tôi biên dịch một dự án mới để đảm bảo mọi thứ đều ổn.lệnh linux "tệp" hiển thị "cho GNU/Linux 2.6.24"

Đầu ra là một cái gì đó tương tự như dưới đây:

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

Câu hỏi của tôi là kể từ Linux Kernel của tôi được cập nhật để 3.0+, tại sao nó vẫn cho thấy nó được biên dịch cho các phiên bản cũ của Linux?

for GNU/Linux 2.6.24 

Có bất kỳ điều gì liên quan đến lệnh file hoặc tôi phải làm gì để biên dịch dự án của mình với hạt nhân Linux mới hơn không?

Cảm ơn

+0

Phiên bản nào của tiêu đề Linux nằm trong '/ usr/src/linux'? – robert

+0

Đầu ra của trình biên dịch không phụ thuộc vào phiên bản hạt nhân bạn đang sử dụng. Nó chỉ phụ thuộc vào trình biên dịch bạn đang sử dụng. –

+0

Có vẻ như tôi có các phiên bản Linux khác nhau tại đây: 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-tiêu đề -3.2.0-23-generic linux-headers-3.2.0-24 linux-headers-3.2.0-24-generic linux-headers-3.2.0-26 linux-headers-3.2.0-26-generic 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

Trả lời

9

Phiên bản hạt nhân được hiển thị bởi tệp trên thực thi không có gì liên quan đến hạt nhân được cài đặt trên hệ thống của bạn. Nó khớp với thư viện C mà chương trình được liên kết với thời gian xây dựng.

Trình biên dịch C của bạn nhắm mục tiêu một thư viện C cụ thể (thường là glibc). Đổi lại, thư viện C nhắm vào một API hạt nhân (tức là thư viện C được xây dựng cho một hạt nhân cụ thể). Đó là phiên bản được hiển thị bởi tệp.

Bạn không phải lo lắng về sự trùng khớp giữa phiên bản hạt nhân được hiển thị bởi tệp và phiên bản hạt nhân được cài đặt trên máy của bạn.

@REALFREE: bạn có thể thử thử nghiệm sau đây. Có lẽ nó sẽ giúp bạn có được một nắm về những gì đang xảy ra:

 
$ 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 

Các thông tin về thẻ ABI được chứa trong một phân khúc elf gọi LƯU Ý. Thông tin này được viết bởi linker khi chương trình được biên dịch. Nó khớp với thẻ ABI của thư viện C.

 
$ 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 

Để xây dựng thư viện C, bạn phải chọn hạt nhân phiên bản. Ở đây, thư viện C được biên dịch cho hạt nhân 2.6.32 nhưng nó cũng hoạt động với các hạt nhân gần đây hơn. Tuy nhiên, nếu chương trình được chạy trên hạt nhân cũ hơn 2.6.32, thì hạt nhân quá cũ cảnh báo được hiển thị.

+0

Cảm ơn. Đó là thông tin đầy đủ mà bạn cung cấp. – mahdi

+0

Tôi đã tự hỏi tại sao chúng khác nhau? Tôi gặp tình huống tương tự mà tệp được biên dịch sử dụng 2.6.24 nhưng phiên bản hạt nhân được cài đặt trên máy là 3.2.0-52 – REALFREE

2

Đó số phiên bản đề cập đến các tiêu đề hạt nhân mà từ đó các thư viện glibc C được xây dựng trên các máy chủ mà các trình biên dịch đã được chạy trên. Nói chung, nó cho thấy mức hạt nhân mà thực thi sẽ được hỗ trợ.

+0

Cảm ơn. Vì vậy, nó có liên quan đến các thư viện tôi sử dụng trong dự án của tôi và tôi không có bất cứ điều gì để thay đổi ở đây. – mahdi

Các vấn đề liên quan