Проверьте, не связана ли эта проблема на самом деле с PostgreSQL, или это проблема сборки вашей библиотеки. Вот простая программа, которую вы можете использовать для dlopen () вашей библиотеки и разрешения символа. Скомпилируйте это с:
gcc dlopentest.c -o dlopentest -ldl
... и запустите его как:
./dlopentest /path/to/my/lib.so somesymbol
или для дополнительной информации префикс LD_DEBUG=symbols
(для других вариантов LD_DEBUG=help
), например:
LD_DEBUG=symbols ./dlopentest /path/to/my/lib somesymbol
Какой символ искать, зависит от вашего кода и для чего он. Вы не предоставили достаточно информации, чтобы сказать.
Эта тестовая программа не будет работать с любой библиотекой, для которой требуются символы из исполняемого файла postgresql для загрузки и инициализации, поэтому, если ваш код (например) является процедурным языком, он не будет загружаться. Хотя самые простые модули загружаются нормально.
Вы также должны проверить вывод:
ldd /path/to/your/library.so
чтобы узнать, ссылается ли он на libstdc ++ или что-то еще, чего вы не ожидаете.
Вот тестовая программа:
// Compile with a c99 compiler; I don't use oldstyle declarations
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char * argv[]) {
if (argc != 3) {
printf("Usage: %s /path/to/lib/to/load symbol_to_resolve\n", argv[0]);
printf(" eg: %s libc.so.6 gettimeofday\n", argv[0]);
return 1;
}
char * err;
const char * const libname = argv[1];
const char * const symname = argv[2];
dlerror(); // clear dl error state before starting work
void * libhandle = dlopen(libname, RTLD_LAZY);
if ( (err = dlerror()) != NULL ) {
printf("Failed to load library: %s\n", err);
return 2;
}
void * symhandle = dlsym(libhandle, symname);
if ( (err = dlerror()) != NULL ) {
printf("Failed to load symbol: %s\n", err);
return 2;
}
printf("Successfully retrieved symbol %s from library %s\n", symname, libname);
// Optional since we're existing, but good for testing:
if ( (err = dlerror()) != NULL ) {
printf("Failed to close lib during exit: %s\n", err);
return 2;
}
return 0;
}