bind の余分な拡張機能2007年08月10日 12時46分33秒

UNIX では C プログラムをコンパイルして、リンカーでリンクする。VOS の世界では、リンクすることをバインドするという。その為、プログラムも bind だ。呼び方が違うだけで、実質的には同じことだ。

VOS C にはライブラリという概念が存在しない。gcc も移植され、OpenVOS といった、GNU 環境では静的ライブラリは動くようだが、動的ライブラリは無いみたいだ。

それ故の拡張だろう。bind はプログラムをリンクして、名前を解決できない関数を、ファイル名を元に探しにいく。例えば、memset が使われているが、指定されたオブジェクトの中に存在しないときだ。そこで、memset.obj というファイルを探して、取り込むのだ。C 言語のライブラリ関数はすべてこれに当たる。この様な拡張が無ければ、Hello world! のプログラムさえも作るのが大変になる。printf を持つオブジェクトファイルを知っている必要があり、また、printf の依存関係も知らなくてはファイルの指定も出来ない。

必要悪ではあるのだろう。しかし、この機能が意図しない同名の関数の実装を勝手に取り込み、異常な動作を起こすのだ。何種類かの事象はあったが、結局は意図しない関数を取り込んだことが原因で、不明な動作を起こすことが多々ある。

そこで、回避策として考えたのが、業とオブジェクトパスを設定せずに、相対または絶対パスで指定をすることだ。