この記事はソフトウェアのプラグインを C/C++ で書こうという人ならば面白いかもしれない記事である.が,そうでない人には多分ちんぷんかんぷんである.
プラグインを開発する際,手元ではコンパイル,リンクできたのに,実行したり,あるいはデバッグしようとすると突然,そんなシンボル(函数や変数の id) はないというエラーになることがある.nm/dumpbin で見るとプログラムの実行形式にはそのシンボルが入っているのに,実行時にはプラグインから認識されないのである.
なぜこのようなことが起こるかというと,リンカが expose するシンボルの最適化をするためのようである.
いくつかの software では plugin のみが使う symbol が core の software に入っている.このような software で build する際には,リンカに参照されなかったシンボルを残しておいて欲しいと頼む必要がある.そうでないと,リンカは使わないものをわざわざ残す必要はないと判断して捨ててしまうからである.もちろん使わないのに置いておいてもディスクとメモリを消費するだけなので通常は都合が良い.
使われてないシンボルを,後で使うかもしれないので,残しておいて欲しいとリンカに頼むには,--export-dynamic という linker option を使う.gcc をlinker の driver に使っている場合,-Wl,--export-dynamic というoption をつける.
こうすると,プラグインだけが参照するシンボルを実行ファイルが持つことができる.
この方法では全ての export されているシンボルが実行ファイルに残ってしまうが,このようなシンボルを個々に指定することもできる.商用のソフトではリバースエンジニアを避けるためにそのような機能を使って必要最小限の情報しか見せないようにする.フリーソフトではそういう心配をしなくていいのがうらやましいことがある.
この記事を書くことになったきっかけは,やはり仕事である.われわれもこういうことをしていて,時々お客に,あなたの所のライブラリ,約束した函数がないじゃないか.という苦情を受けることがある.それだけではない,先日は会社の内部の同僚が機能を使えなくなってしまったのである.すまん,Matthias.