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ライブラリは特定のカーネル用に構築されています)。これがファイルで表示されるバージョンです。

ファイルに表示されるカーネルバージョンとマシンにインストールされているカーネルバージョンの不一致について心配する必要はありません。

@REALFREE:次の実験を試すことができます。多分それはあなたが何が起こっているのかを把握するのに役立つでしょう:

$ uname -r
3.10-2-amd64
$ gcc -Wall -Werror hello.c -o hello
$ readelf --notes ./hello
長さ0x00000020のファイルオフセット0x0000021cで見つかったメモの表示:
  所有者データサイズ説明
  GNU 0x00000010 NT_GNU_ABI_TAG(ABIバージョンタグ)
    OS:Linux、ABI:2.6.32

ABIタグに関する情報は、NOTEと呼ばれるelfセグメントに含まれています。この情報は、プログラムのコンパイル時にリンカによって書き込まれます。CライブラリのABIタグと一致します。

$ 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
長さ0x00000020のファイルオフセット0x00000294で見つかったメモの表示:
  PropriétaireTailledesdonnées説明
  GNU 0x00000010 NT_GNU_ABI_TAG(エチケットデバージョンABI)
    OS: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 に答える