g++ がリンク先の libstdc++ のバージョンを選択する方法と、ライブラリの「システム」バージョンが異なる場合の意味を理解しようとしています。
私は gcc/g++ 4.1.2 を使用しています。これには、ABI ガイドラインのドキュメントによると、libstdc++.so.6.0.8 が含まれています。
-rwxr-xr-x 1 root root 4397810 May 18 2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8
ABI の前方互換性に関する私の理解に基づいて、g++ 4.1.2 でビルドし、6.0.8 より後のバージョンの libstdc++ を使用するシステムでコードが実行されることを期待できますが、以前のバージョンのシステムでは実行されません。古いバージョンの ABI が含まれます。
同じマシンの /usr/lib には古いバージョンの libstdc++ があります。
-rwxr-xr-x 1 root root 804288 Jul 22 2005 /usr/lib/libstdc++.so.6.0.3
このマシンで g++ 4.1.2 を使用してコードをコンパイルし、それを ldd すると、参照されている /usr/lib の libstdc++ のバージョンが 6.0.3 であることがわかります。
# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.
/usr/lib が最初にチェックされるため、これは予期されることです。そして、アプリケーションは正常に動作します。
私の質問は、ここで何が起こったのですか?
g++ 4.1.2 は、そのリリース (6.0.8) の一部である libstdc++.so のバージョンに対してリンクされていますか? もしそうなら、実行可能ファイルが実行時に /usr/lib の古いバージョンを使用できるのはなぜですか?それには古い ABI があります。幸運?
または、g++ 4.1.2 はリンク時に libstdc++ (6.0.3) の /usr/lib バージョンを取得してそれを使用しましたか?実行時に実行可能ファイルと同じ方法でライブラリ パスを解決するからです。libstdc++ が「独自の」バージョンでなくても、g++ はそれを行うことができますか? g++4.1.2 (6.0.8) の libstdc++ バージョンの目的は何ですか? このプロセスでまったく使用されましたか?
任意の洞察をいただければ幸いです。