web-dev-qa-db-ja.com

.oと.koファイルの違い

簡単なLinuxモジュールmod.cを書いています。 mod.cファイルをコンパイルすると、2つの出力ファイルmod.oおよびmod.koが作成されます。 mod.oとmod.koファイルの違いは何ですか?

48
beparas

簡単な答えは、。koファイルは、カーネルが必要とするいくつかのカーネル自動生成データ構造にリンクされたオブジェクトファイルであるということです。

。oファイルは、モジュールのオブジェクトファイル-Cファイルのコンパイル結果です。カーネルビルドシステムは、カーネルモジュールを記述するデータ構造(your_module_kmod.cという名前)を含む別のCファイルを自動的に作成し、このCファイルを別のオブジェクトファイルにコンパイルし、オブジェクトファイルとビルドされたオブジェクトファイルをリンクして作成します- 。koファイル。

カーネルモジュールのロードを担当するカーネル内の動的リンカーは、カーネルが。koファイル内のkmodオブジェクトに配置したデータ構造を見つけることを期待しており、カーネルモジュールをロードできません彼らがいなければ。

44
gby

Linux 2.6以前では、ユーザースペースプログラムはELFオブジェクト(.o)ファイルを解釈し、実行中のカーネルにリンクするすべての作業を行い、完成したバイナリイメージを生成していました。プログラムはそのイメージをカーネルに渡し、カーネルはそれをメモリに固定するだけです。 Linux 2.6では、カーネルがリンクを行います。ユーザー空間プログラムは、ELFオブジェクトファイルの内容を直接カーネルに渡します。これが機能するには、ELFオブジェクトイメージに追加情報が含まれている必要があります。この特定の種類のELFオブジェクトファイルを識別するために、「。o」の代わりに接尾辞「.ko」(「カーネルオブジェクト」)を付けてファイルに名前を付けます。たとえば、Linux 2.4のファイルserial.oにあったシリアルデバイスドライバLinux 2.6では、serial.koファイルにあります。

from http://tldp.org/HOWTO/Module-HOWTO/linuxversions.html

15
Raulp