PostgreSQL自定义C函数导入失败:“ sprintf_chk:未找到符号”

时间:2019-09-23 15:32:37

标签: c postgresql stdio

我想使用stdio.h库中的函数来处理PostgreSQL C函数中的某些字符串。问题:由于某种原因,当我尝试使用CREATE EXTENSION将其导入数据库时​​,它失败并返回: ERROR: could not load library "/usr/local/lib/postgresql/test.so": Error relocating /usr/local/lib/postgresql/test.so: __sprintf_chk: symbol not found。 这是我使用的测试功能:

#define _XOPEN_SOURCE

#include "postgres.h"
#include "fmgr.h"
#include "funcapi.h"
#include "executor/executor.h"
#include "executor/spi.h"
#include "utils/builtins.h"
#include <stdlib.h>
#include <stdio.h>

PG_FUNCTION_INFO_V1(printTest);
Datum printTest(PG_FUNCTION_ARGS) {
    char str[50];
    int i = 9;
    sprintf(str, "Hello I am PostgreSQL %d ! \n", i);
    PG_RETURN_TEXT_P(cstring_to_text(str));
}

这是我的Makefile:

PG_CPPFLAGS = -I$(/usr/include)
SHLIB_LINK = $(stdio.h)

EXTENSION = test
DATA = test--0.1.sql
MODULE_big = test
OBJS = test.o

PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

我正在Docker容器中使用PostgreSQL 9.6。

我已经在另一个库中遇到这样的问题,解决方案是更改makefile。这次我也尝试这样做,但是它不起作用,我不知道还有什么要更改的。

如果您知道导致问题的原因,我们将非常欢迎。

我知道一本书或网站的名称,该书或网站提供了有关如何为Postgres编写C函数的良好文档,因此,我们深受欢迎。我经常遇到这种愚蠢的问题,因为官方文档太弱了。

1 个答案:

答案 0 :(得分:0)

您的功能运行正常,但您忘记了该行

PG_MODULE_MAGIC;

开始。

构建共享库的方式一定存在问题。

正确的是:

PATH=/where/your/postgres/is/bin:$PATH make

有关更多信息,请共享您的扩展SQL脚本,控制文件和确切的构建过程。