第四十六章. 链接动态链接的函数
在你创建并注册完用户定义的函数后,你的工作就基本完成了.但是,
Postgres
必须把实现你的函数的目标码(例如,一个
.o 文件,或一个共享库)装载进来.正如我们前面所说,
Postgres
在运行时根据需要把你的代码装入内存.为了让你的代码能够动态装载,你可能要把它们用一种特殊的方法编译和链接-编辑它们.本章简单的介绍在你应该怎样进行要求的编译和链接,才能够把你自定义的函数装载到正在运行的
Postgres
服务器里去.
如果你有特殊的问题,我们希望你能好好读一下 C 编译器 cc(1),和链接器,ld(1)
的手册页(最好多读几便).另外,在回归测试套件的目录
PGROOT/src/regress
里包含这个过程的几个工作样本.如果你按照这些测试的例子做,你应该没有任何问题.
会用到下面几个术语:
动态装载(Dynamic loading)是 Postgres
对一个目标文件的操作.目标文件被拷贝进入运行着的 Postgres
服务器中并且文件里的函数和变量可以被 Postgres
进程内的函数使用.Postgres 利用操作系统提供的动态装载的机制来实现这个目的.
装载和链接编辑(Loading and link editing)是你为了生成某种其他类型的目标文件对目标文件做的处理(例如,一个可执行程序或一个共享库).你使用链接编辑程序,ld(1),来执行这些操作.
下面的通用限制和注释适用于后面的讨论:
给创建函数命令的路径必须是绝对路径(也就是说,以 "/" 开头),该路径指向一个 Postgres
服务器运行的机器上的该服务器可见的目录.
小技巧:相对路径实际上也可用,但却是与数据库存放的路径(通常是前端应用不可见的)相对的目录.显然,把路径设为与用户启动的前端应用相对的路径是没有意义的.因为服务器可能是运行在完全不同的机器上!
Postgres 用户必须能够访问赋予创建函数命令的路径并且能够读取该目标文件.这是因为 Postgres
服务器以 Postgres 用户的身份运行,而不是以运行前端进程的用户的身份运行.(把文件或一个目录的权限设成
"postgres" 用户不能读和/或不能执行是一个极为常见的错误.)
Linux
在 Linux ELF 里面,目标文件可以通过声明编译选项 -fpic 生成.
例如,
# simple Linux example
% cc -fpic -c foo.c
生成一个目标文件
foo.o 就是可以动态装载入
Postgres.不需要进行附加的装载或者链接编辑工作.