首页 > 数据库 > PostgreSQL > 正文

PostgreSQL7.0手册-程序员手册 -46. 链接动态链接的函数

2019-09-08 23:33:42
字体:
来源:转载
供稿:网友
第四十六章. 链接动态链接的函数
内容 
Linux 
DEC OSF/1 
SunOS 4.x, Solaris 2.x 和 HP-UX 
在你创建并注册完用户定义的函数后,你的工作就基本完成了.但是,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" 用户不能读和/或不能执行是一个极为常见的错误.)
定义在目标文件里的符号名一定不能互相冲突,或与定义在 Postgres 里的其他符号冲突. 
GNU C 通常不提供利用操作系统的动态链接器的接口的选项.在这种情况下就必须使用操作系统附带的 C 编译器.

Linux
在 Linux ELF 里面,目标文件可以通过声明编译选项 -fpic 生成. 
例如, 

# simple Linux example
% cc -fpic -c foo.c
生成一个目标文件 foo.o 就是可以动态装载入 Postgres.不需要进行附加的装载或者链接编辑工作.

--------------------------------------------------------------------------------

DEC OSF/1
在 DEC OSF/1 里,你可以用带合适参数的 ld 命令把任何简单的目标文件变成一个共享的目标文件.此命令用起来象: 
# simple DEC OSF/1 example
% cc -c foo.c
% ld -shared -expect_unresolved '*' -o foo.so foo.o
生成的共享文件马上就可以装载入 Postgres.当为创建函数命令声明目标文件时,我们必需给出共享文件的文件名(以 .so 结尾)而不是简单的目标文件. 
小技巧:实际上,对于共享目标文件而言 Postgres 并不关心你给这个文件什么名称.如果你喜欢把你的共享目标文件命名成以 .o 结尾,对 Postgres 而言是没有问题的,只要你保证你给创建函数命令的文件名也是正确的就行了.换而言之,你必须保持一贯.不过,从务实的角度出发,我们不建议这么做,因为你很容易会把自己搞迷糊,不知道哪个文件是转换过的共享文件,而哪一个不是.例如,如果目标文件和共享文件都以 .o 结尾,你很难写一个 Makefile 来做自动连接编辑工作!
如果你声明的文件不是共享文件,后端就会挂起! 

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

DEC OSF/1
在 DEC OSF/1 里,你可以用带合适参数的 ld 命令把任何简单的目标文件变成一个共享的目标文件.此命令用起来象: 
# simple DEC OSF/1 example
% cc -c foo.c
% ld -shared -expect_unresolved '*' -o foo.so foo.o
生成的共享文件马上就可以装载入 Postgres.当为创建函数命令声明目标文件时,我们必需给出共享文件的文件名(以 .so 结尾)而不是简单的目标文件. 
小技巧:实际上,对于共享目标文件而言 Postgres 并不关心你给这个文件什么名称.如果你喜欢把你的共享目标文件命名成以 .o 结尾,对 Postgres 而言是没有问题的,只要你保证你给创建函数命令的文件名也是正确的就行了.换而言之,你必须保持一贯.不过,从务实的角度出发,我们不建议这么做,因为你很容易会把自己搞迷糊,不知道哪个文件是转换过的共享文件,而哪一个不是.例如,如果目标文件和共享文件都以 .o 结尾,你很难写一个 Makefile 来做自动连接编辑工作!
如果你声明的文件不是共享文件,后端就会挂起! 

--------------------------------------------------------------------------------
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选