C库提供'__gxx_个性v0';Postgres中的错误

C库提供'__gxx_个性v0';Postgres中的错误,c,postgresql,debian,C,Postgresql,Debian,我正在构建一个新的64位Debian Squeeze服务器,Postgres 8.4在我尝试恢复数据库时报告了记录良好的“undefined\uuuuugxx\uPersonality\uv0”错误 lib构建/安装良好 但是,源是C,不是C++,它似乎是在这里,xgxxPuxalItAvivIv0所属。< /P> 代码来自32位蚀刻/postgres 8.1环境 我有点困了,但我敢打赌解决办法很简单 测试该问题是否与PostgreSQL有关,或者是否与库构建有关。下面是一个简单的程序,您可以使

我正在构建一个新的64位Debian Squeeze服务器,Postgres 8.4在我尝试恢复数据库时报告了记录良好的“undefined\uuuuugxx\uPersonality\uv0”错误

lib构建/安装良好

但是,源是C,不是C++,它似乎是在这里,xgxxPuxalItAvivIv0所属。< /P> 代码来自32位蚀刻/postgres 8.1环境


我有点困了,但我敢打赌解决办法很简单

测试该问题是否与PostgreSQL有关,或者是否与库构建有关。下面是一个简单的程序,您可以使用它打开库并解析符号。用以下代码编译:

gcc dlopentest.c -o dlopentest -ldl
。。。并将其作为:

./dlopentest /path/to/my/lib.so somesymbol
或更多信息前缀
LD_DEBUG=symbols
(其他选项
LD_DEBUG=help
),例如:

要查找哪个符号取决于您的代码及其用途。你没有提供足够的信息来说明

此测试程序不会与任何需要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;
}
//使用c99编译器编译;我不使用旧式声明
#包括
#包括
#包括
int main(int argc,char*argv[]){
如果(argc!=3){
printf(“用法:%s/path/to/lib/to/load symbol_to_resolve\n”,argv[0]);
printf(“例如:%s libc.so.6 gettimeofday\n”,argv[0]);
返回1;
}
字符*错误;
const char*const libname=argv[1];
常量字符*常量符号名=argv[2];
Dleror();//开始工作前清除dl错误状态
void*libhandle=dlopen(libname,RTLD_-LAZY);
如果((err=dlerror())!=NULL){
printf(“未能加载库:%s\n”,错误);
返回2;
}
void*symhandle=dlsym(libhandle,symname);
如果((err=dlerror())!=NULL){
printf(“加载符号失败:%s\n”,错误);
返回2;
}
printf(“从库%s中成功检索到符号%s\n”,符号名,libname);
//可选,因为我们已经存在,但适合测试:
如果((err=dlerror())!=NULL){
printf(“退出时关闭库失败:%s\n”,错误);
返回2;
}
返回0;
}

Postregs已从软件包中安装。自由党是我们自己的。源代码在etch上构建/运行良好,但在新服务器上构建时,会导致Postgres投诉,如前所述。Postgres 8.4不是当前的版本吗?如果您指的是8.1,我知道它很旧,这就是我尝试升级的原因:)啊,对不起。我没有注意到您要升级到8.4,给人的印象是,您试图在压缩时让代码达到8.1。您的库代码是用
g++
还是用
gcc
编译的?它是否链接到系统未附带的任何其他库?一个简单的测试程序dlopen()能让你的库没有问题吗?例如,只有在PostgreSQL加载时才是问题所在,还是在加载你的自定义库时才是问题所在?最后,了解你的问题库是否是PostgreSQL扩展(C函数/类型或类似类型)会有所帮助或者它是否有其他用途,如plperl或plpython模块、LD_预加载库等。如果它是带有PG_模块_MAGIC等的postgresql扩展模块,它是否使用V0或V1 API?它是使用标准PGX构建的,还是使用一些自制的构建脚本?如果运行
objdump-T mylibname.so | grep UND
您是否看到列出的uuugxx_personality_v0符号?是否只有在尝试还原使用自定义C函数/数据类型的数据库时才会出现错误?或者任何数据库?
// 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;
}