C/C++ (または任意のコンパイラ) でシンボルを具体的に上書きすることは可能ですか? たとえばa.lib
、他の関数に加えて、の実装を含むライブラリがありますfoo()
。さて、私のプログラムでは、 の実装foo()
を別の関数に置き換えて、 への呼び出しがfoo()
の実装ではなく、私の実装に直接行くようにしたいと考えていa.lib
ます。
マクロはオプションではありません。
ソースを変更せずにこれは可能a.lib
ですか?
C/C++ (または任意のコンパイラ) でシンボルを具体的に上書きすることは可能ですか? たとえばa.lib
、他の関数に加えて、の実装を含むライブラリがありますfoo()
。さて、私のプログラムでは、 の実装foo()
を別の関数に置き換えて、 への呼び出しがfoo()
の実装ではなく、私の実装に直接行くようにしたいと考えていa.lib
ます。
マクロはオプションではありません。
ソースを変更せずにこれは可能a.lib
ですか?
はい、たぶん。
静的リンクを行うと、リンカは必要な場合にのみシンボルをライブラリから読み込みます。プログラムまたは以前のライブラリがそのシンボルを提供している場合、それは「必要な」リストにはありません。
ライブラリが必要な他のシンボルと同じ「オブジェクト」でそのシンボルを定義した場合、問題が発生します。適切に設計されたライブラリには、シンボルごとに 1 つのオブジェクトがあります (基本的に、各関数は独自のソース ファイルで定義され、個別にコンパイルされ、個別にライブラリに追加されます)。適切に設計されていないライブラリには、一度に複数の関数を定義するオブジェクト (ソース ファイル) が含まれている可能性があり、1 つだけを取得するためにそれらすべてを取得する必要があります。うまくいけば、この問題はありません。
Linux システム (およびその他の Unix) の動的ライブラリについては、それほど明確ではありません。関数を定義すると、独自の呼び出し元によって使用される可能性がありますが、ライブラリ内の呼び出し元は引き続きライブラリ コピーを使用する可能性があります。それはすべて少し混乱しています。Windows では、.lib
ファイルはおそらく Linux の.a
ファイルと同じように機能しますが、.dll
ファイルはまったく別の動物であり、さまざまな方法で混乱を招きます。