ERROR: could not load library "/usr/lib/pgsql/test.so": /usr/lib/pgsql/test.so" undefined symbol: palloc
쿼리 select 실행하면
뜨는 이유가 뭐에요? 헤더파일도 포함되어 있는데
음, 아이디가 초보DBA(r00tlee)에서 상록수로 바뀌었네요. 위 문제는 컴파일시의 옵션이 잘못 되었을 확률이 매우 높습니다.
nm 으로 test.so파일을 열어보면...
palloc 주소값이 들어있지 않습니다... 주소값을 가져오지 못해서 undefined symbol이 나는데요..
왜 못 가져오는지 모르겠네요..
음, 소스와 컴파일 명령 그리고 ldconfig -v | grep 'pg' 을 실행한 결과, PostgreSQL 을 설치한 경로를 올려봐 주세요.
일단 C 소스 작성
#include "postgres.h"
#include <string.h>
text *add_one(text *arg)
{
char buf[40] = "abcd";
text *temp = (text *) palloc(VARHDRSZ + 40);
temp->vl_len = VARHDRSZ + 40;
memcpy(temp->vl_dat, buff, 40);
return temp;
}
컴파일은 cc , gcc 2가지 방법으로 시도 해보았습니다.
cc -fpic -I/root/test/postgresql-9.4.4/src/include -c test.c
cc -shared -o test.so test.o
ldconfig -v | grep 'pg'
/usr/lib/pgsql:
libecpg_compat.so.2 -> libecpg_compat.so.2.1
libgpg-error.so.0 -> libgpg-error.so.0.3.0
libospgrove.so.0 -> libospgrove.so.0.0.1
libecpg.so.5 -> libecpg.so.5.1
libpgtypes.so.2 -> libpgtypes.so.2.1
버전 정보를 확인해보니
/usr/bin/postgres --version
postgres (PostgreSQL) 8.1.23 입니다.
문제 해결했습니다.
문제가 되었던게 설치한 버전대랑 다운 받아서 빌드한 소스 버전대가 일치하지 않아서 문제가 생겼습니다.
감사합니다 :)