Библиотека C выдает ошибку «__gxx_personality_v0» в Postgres - PullRequest
0 голосов
/ 03 декабря 2011

Я создаю новый 64-битный сервер Debian Squeeze, и Postgres 8.4 сообщает о хорошо документированной ошибке 'undefined __gxx_personality_v0', когда я пытаюсь восстановить базу данных.

lib прекрасно работает / устанавливается.

Тем не менее, источником является c, а не c ++, который, кажется, принадлежит __gxx_personality_v0.

Код взят из 32-битной среды Etch / postgres 8.1.

Я немного застрял, но держу пари, что решение очень простое!

1 Ответ

2 голосов
/ 04 декабря 2011

Проверьте, не связана ли эта проблема на самом деле с 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;
}
...