2012-02-19 7 views
0

私はJohn R. LevineのLinkers and Loadersを読んでいました。オブジェクトファイルのプロパティには、次のうちの1つ以上が含まれていることがあります。は ".o"ファイル "loadable"ですか?

  1. ファイルはリンク可能
  2. ファイルがロード可能な
  3. ファイルは、この例を考えると、今

実行する必要がありますする必要がありますする必要があります:

私はコンパイルしてリンクする
#include<stdio.h> 
int main() { 
    printf("testing\n"); 
    return 0; 
} 

 
$ gcc -c t.c 
$ gcc -o t t.o 

objdumpを使用してt.oを検査しましたが、そのタイプはRELと表示されます。 t.oはすべてのプロパティで満足しますか?私はリンク可能で、実行不可能であると信じています。私はそれがロード可能ではないと信じていたでしょう(あなたが.oファイルから.soファイルを作成しない限り)。しかしタイプRELは、移転することになっていることを意味し、移転は移送のコンテキストでのみ発生するため、ここでは混乱しています。 疑問の要約: -

  1. ".o"ファイルloadableはありますか?
  2. ".o"ファイル、 ".so"ファイルに存在するセクションに関するリソースを読む - 違いなど?

答えて

1

オブジェクトファイル(拡張子が.oのファイル)は読み込みできません。これは、その中のすべてのシンボルを解決する方法に関する重要な情報が不足しているためです:この場合、特にシンボルprintlnは追加情報が必要です。 (Cコンパイラは、ライブラリIDを作成するオブジェクトファイルにバインドしません。便利なこともあります)

オブジェクトファイルを共有ライブラリ(.so)にリンクすると、そのバインディングが追加されます。通常、複数のオブジェクトファイルをグループ化し、それらの間の参照を解決します(さらにいくつか難解なことがあります)。その結果、ローダーは参照の解決とそれがまだ分かっていない依存関係のロードを行うことができるので、結果をロードすることができます。

そこから実行可能ファイルへの移行は、通常、OS定義のプログラムブートストラップに追加するだけです。これは、OSが呼び出してプログラムを実行する小さなコードです。通常は、残りのプログラムと依存関係をロードし、引数の情報をmain()と呼ぶことによって動作します。 (メインが返ってきたら正常終了する責任もあります)

+0

プログラムブートストラップでは、libc_start_mainを参照していますか? –

+1

@eQuiNoX__現代のリンカが実際にコードを内部で保持しているかもしれないが、私は通常、(リンクする前に) 'crt0.o'と呼ばれるファイルにあるコードを参照しています。 –

+0

通常symbol _start –

1

文脈を設定するだけでthis link州は同様の状態になります(可読性のみを強調する);

ファイルリンクエディタまたは ローダを連結することによって入力として使用架橋性、であってもよいです。それは メモリにロードされたプログラム、または 3の任意の組み合わせと一緒にライブラリとしてメモリに をロードすることが可能なプログラム、ロード可能な、として実行することができる実行、ことが私の。

の.oファイルがと間違いリンク可能な実行可能ではない、この定義に係るリンカーオブジェクトファイル、です。 Loadableは厳しい呼び出しですが、.oファイルはプラットフォーム間のトリッキーなことがなくても読み込めないので、はロードできません。です。

関連する問題