2009-07-24 18 views
5

これはすべての人が話しているが、誰も定義していないもののようです...私はこのトピックに関する情報を見つけることはできません。シンボル解決とは何ですか?これは私が見つけた最高のものです:http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter2-90421.html#chapter2-93321シンボルの解像度とは何ですか?

あなたのプログラムのコンパイル方法と関係がありますか?

答えて

5

Unixのnmについて言及したので、シンボルの解像度を特定できます。

実行可能ファイルは、内部で定義されていないエンティティを参照することができます。例えば、共有ライブラリ上の変数や手続き。これらのエンティティは外部シンボルによって識別されます。実行可能ファイルには、ライブラリの場合はもちろん、外部ファイルによって参照できる内部シンボルもあります。

シンボル解決は、プログラムがメモリにロードされると、それが参照するすべての外部エンティティに適切なアドレスを割り当てることです。これは、外部シンボルへの参照が行われたロードされたプログラム内のすべての位置を変更することを意味します。

これらのアドレスは、メモリ内で外部シンボルを含むコードがロードされた場所によって異なります。

Unixでは、プログラムのデフォルトのコンパイルモードは、実行可能ファイルに必要なものすべてを事前にリンクするのではなく、システム共有ライブラリを使用することです。たとえば、gccでプログラムをコンパイルするときに、未解決のシンボリックリファレンスを持つ代わりに、静的にコンパイルする場合は-staticフラグを渡します。

詳細については、「共有ライブラリ」を参照してください。

+0

は理にかなって、どうもありがとうございました。私は "共有ライブラリ"も検索します。これについてもっと学ぶためにあなたが推薦できる本がありますか? –

+1

私が知っている最も良い本は[_Linkers and Loaders_ by John R. Levine](http://rads.stackoverflow.com/amzn/click/1558604960)です。 – alanc

1

シンボルの解像度がどのような意味であるのかよくわかりませんが、共有ライブラリのランタイムシンボル解決のためにdlopen(3)とdlsym(3)が思い出されます。

+0

UNIX上でnmコマンドを使って使用するという意味で意味します。それは役に立ちますか?私はdlopenがどちらであるかわからないので、あなたが近くにいるかどうかは言えません。 –

1

前述のとおり、実行時またはリンク時のシンボル解決を参照できます。しかし、コンパイル時のシンボルの解像度を忘れないでください。

これは、シンボルを「物」にマップするために使用するルールです。シンボルは名前のようなもの(ローカル、メンバ、グローバル変数、関数、メソッド、タイプなど)とコンパイラが名前の意味を理解しているものです。

これを行うためのルールは、かなり単純です(たとえば、IIRCのCでは見た目の並べ替えのリストよりも少しです)。あるいは複雑です(C++には、オーバーロード、テンプレートなどの大文字と小文字があります)。一般的に、これらのルールは、プログラムのセマンティクスと相互作用し、時には彼らも(潜在的に)あいまいさにつながることができます。

C++:

int First(int i) { return i; } 
float First(float f) { return f; } 

void Second(int (*fn)(int)) { printf("int"); } 
void Second(float (*fn)(float); { printf("float"); } 

... 

Second(&First); // What will be printed? 
関連する問題