これは、誰もが話していることの1つですが、誰も定義していません...このトピックに関する情報が見つからないようです。シンボル解像度とは何ですか?これは私が見つけた最高のものです:http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter2-90421.html#chapter2-93321
それはあなたのプログラムがどのようにコンパイルされるかと関係がありますか?
これは、誰もが話していることの1つですが、誰も定義していません...このトピックに関する情報が見つからないようです。シンボル解像度とは何ですか?これは私が見つけた最高のものです:http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter2-90421.html#chapter2-93321
それはあなたのプログラムがどのようにコンパイルされるかと関係がありますか?
さて、Unix の nm について言及されたので、シンボルの解像度を特定できます。
実行可能ファイルは、それ自体の内部で定義されていないエンティティを参照できます。たとえば、共有ライブラリの変数またはプロシージャです。これらのエンティティは、外部シンボルによって識別されます。実行可能ファイルには、外部ファイルから参照できる内部シンボルが含まれている場合もあります。これは、もちろんライブラリの場合と同様です。
このコンテキストでのシンボル解決とは、プログラムがメモリにロードされると、参照するすべての外部エンティティに適切なアドレスを割り当てることです。これは、外部シンボルへの参照が行われた、ロードされたプログラム内のすべての位置を変更することを意味します。
これらのアドレスは、外部シンボルを含むコードがメモリ内のどこにロードされているかによって異なります。
Unix では、プログラムのデフォルトのコンパイル モードは、実行可能ファイルに必要なすべてのものを事前にリンクするのではなく、システム共有ライブラリを使用することです。たとえば、プログラムを でコンパイルする場合、未解決のシンボリック参照を持たずに静的にコンパイルする場合gcc
は、フラグを渡します。-static
詳細については、「共有ライブラリ」を参照してください。
前述のように、実行時またはリンク時のシンボル解決を参照できます。ただし、コンパイル時のシンボル解決を忘れないでください。
これは、言語がシンボルを「モノ」にマップするために使用するルールです。シンボルは、名前のように見えるほぼすべてのもの(ローカル、メンバー、グローバル変数、関数、メソッド、型など)であり、「もの」は、名前が何を指しているかをコンパイラーが理解しているものです。
これを行うためのルールは、かなり単純(たとえば、CのIIRCは、見る場所の順序付きリストにすぎません)または複雑(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?
シンボル解決を意味するコンテキストがわかりません。しかし、共有ライブラリでの実行時のシンボル解決のための dlopen(3) と dlsym(3) を思い出します。