共有ライブラリでエクスポートしないWindowsでは共有ライブラリ(DLL)を作るとき、エクスポート(公開)する関数を明示的に指定しなければなりませんが、Linuxの共有ライブラリ(so)ではstatic宣言してないものはすべてエクスポートしてくれるので、めんどくさくなくていいな、などとずっと思っていたのですが、それはそれでちょっと困ったことも起きてしまいます。以下はLinuxでの話となります。想定していない方を呼び出すこことがあります。別のライブラリ内の同名関数を呼び出す可能性があることを意味します。各ライブラリ内でそれら同名関数をstatic宣言すればそんな問題は起こらないのですが、1つのライブラリを構成するソースファイルが複数に分かれていたりしてそういう対応ができないケースも多々あります。Cの関数をstaticにしておいて関数のポインタを別途取得して使うようなC++っぽい解決方法もあるにはありますが、そもそも既存のコードを再利用したいような場合にはやりたくない変更となります。-ltest2で生成したバイナリではlibtest1.soのものが優先され、libtest2.soのものが呼ばれることはないことになります。a.outの実行結果の先に表示されるライブラリがより優先度が高いことになります。環境変数LD_PRELOADにフルパスで設定されたライブラリは無条件で先に読み込まれるようになるため、無理やり優先度を高くすることができるようです。共有ライブラリをソースからビルドできる環境があるなら、そんな微妙なことをしなくても、Windowsのように指定した関数だけをエクスポートするだけで解決できるかもしれません。実はgccはそんな機能を提供しています。-Wl,--version-script=test1.mapのようにすれば、publicfunction関数だけがエクスポートされます。libtest1.soを実行するとエクスポートされている関数名が確認できます。ちなみに、さらにC++のメソッドをエクスポートしたい場合はマップファイルを以下のようにすればいいようです。*;};ここで’?’は’~’が使えないことをカバーするためのワイルドカード(1文字)で、publicclassメソッドの後ろにワイルドカード(0文字以上)が付いているのはオーバーロードに対応するためのものと推察します。共有ライブラリはとても便利ですが、場合によっては地獄に落とされると言う話でした。新しいコメントがついたらメールで通知。キャンセル%d人のブロガーが「いいね」をつけました。