Chapter 12. 動的ロード関数のリンク

Table of Contents
ULTRIX
DEC OSF/1
SunOS 4.x, Solaris 2.x and HP-UX

ユーザ定義関数を作成し、登録すれば、作業は終ったようなも のです。 しかし、Postgresはあなたの関数が実装さ れているオブジェクトコード(すなわち、.o ファ イル、もしくは共有ライブラリ)をロードしなくてはなりません。 前に述べたとおり、Postgres は あなたのコードを実行時に、必要に応じてロードします。 コードが動的にロードされるようにするためには、 特別な方法でコンパイルとリンクをしなくてはなりません。 この節では、実行中のPostgresサーバがあ なたのユーザ定義関数をロードできるようにするために、どのようにコ ンパイルとリンクをするかについて説明します。 この作業手順はバージョン 4.2 のときとは、変わっていることに注意し て下さい。

Tip: 古いPostgresの動的ローディング機構は、動的ロー ダを書く人が持つような、実行プログラムの形式やメモリ内での配置やアライ メントに関する深い知識を必要としていました。 そのようなローダは遅くて、バグが多くなりがちでした。 バージョン 4.2 において、Postgres 動的ロー ディング機構はオペレーティングシステムが提供する動的ローディング機構を 使うように書き直されました。 このアプローチにより、以前に我々が書いた動的ローディング機構に比べると、 全体に速く、堅牢で、移植性の良いものになりました。 その理由は、最近のバージョンのUNIXが共有ライブラリを実装するために動的 ローディング機構を使っており、それゆえに速くて堅牢な機構でなくてはなら ないからです。 他方、オブジェクトファイルはPostgresにロー ドされる前に、ちょっとした後処理をしなくてはなりません。 使い勝手がわずかに落ちることは、スピードと堅牢さの大幅なアップにより 埋め合わせできるのではないかと思います。

何か疑問が生じたら、Cコンパイラ cc(1) と、リンカ ld(1) の マニュアルページを(何度も何度も)読むべきです。 また、ディレクトリPGROOT/src/regress に入っている regression test 一式には、この処理に関して 動作する例がいくつか入っています。 これらのテストがしていることを真似れば、なにも問題は無いでしょう。 以下、次のような用語が使われます。

次に述べる一般的な制限や注意事項は、後述する説明においても適用されます。

ULTRIX

ULTRIXで動的ロード可能なオブジェクトファイルを作るのは、とても簡 単です。 ULTRIXは共有メモリ機構を持っていませんが、それゆえ、動的ローディ ングインターフェースに対して、なにも制約を設けていません。 一方、我々は移植性の無いダイナミックローダを我々自身で(再度)書か ねばならなかったし、本当の共有ライブラリを使うこともできませんで した。 ULTRIXにおいて、唯一の制限はオブジェクトファイルを作成する時に オプション -G 0 を使わなれけばならないということです。 (数字の ``0'' であり、文字の ``O''ではないことに注意)。 例えば、

# simple ULTRIX example
% cc -G 0 -c foo.c
これは、foo.o という名前で Postgresに動的ロ ーディングできるオブジェクトファイルを生成します。 この他に追加のローディングやリンク処理をする必要はありません。

Notes

[1]

(訳註)このPostgres ユーザとは、サー バを起動するユーザ(通常は postgres )のことです。