2016-10-11 19 views
1

実行可能ファイルと共有ライブラリに同じ名前の関数が含まれているとどうなりますか?たとえば、EXEはこのように定義しています実行可能ファイルと共有ライブラリに同じ名前の関数が含まれていますか?

extern int fund() 
{ 
    return 0; 
} 

と共有ライブラリが同じ定義を有する:

extern int fund() 
{ 
    return 1; 
} 

何の機能が実行可能ファイルと共有ライブラリからから呼び出されます。 1 - Windows用の? 2 - UNIXベースの場合?

PS:MFCアプリケーションでAfxWinMainを定義すると、起動時にAfxWinMainの代わりにMFC DLLが呼び出されます。私はいくつかの理論が必要なのはなぜですか?

+1

これはC言語では異なるので、タグをスパムしないでください。 – George

+0

@ジョージ:確かに?技術的にはコンパイラに任されますが、私が知っているのは、 'fund'をそのモジュールで定義されているシンボルに解決することだけです。 – MSalters

+0

@Mikhail Kipa:Windows X + 1がWindows DLLに新しい関数を追加して、実行可能ファイル内の同じ名前の関数と衝突する場合、どうなるか考えてみましょう。 – MSalters

答えて

1

あなたは既に自分自身に向かって質問に答えました。

非共有ライブラリの依存関係はリンク時に解決され、ロード時には解決されません。リンカーが静的ライブラリに対する外部参照を満たすと、それはそのままの状態になり、WindowsやUnixローダーはそれ以上解決しようとしません(シンボルは通常、リンクステージの後にバイナリで "可視"さえありません) 。

ライブラリに対して(静的または動的に関係なく)リンクするとき、リンカは、要件を満たす参照を見つけたらすぐに解決するシンボルの検索を停止し、他のもの(または同じもの)ライブラリを作成します。そのため、ライブラリで同じ関数の複数の定義を指定することができます(オブジェクトファイルではなく、完全に検索され、重複したシンボルがあるかどうかが確認されます)。

ロード時に解決する必要があるシンボルのみが「外部共有」としてマークされ、実行時にローダーによって解決されます。

私は、この点に関して、UNIXOSとWindowsの間に根本的な違いはありません。

関連する問題