2011-12-03 7 views
0

新しい64ビットDebian Squeezeサーバを構築していて、データベースを復元しようとすると、Postgres 8.4でよく書かれた '未定義__gxx_personality_v0'エラーが報告されます。PostgresでCライブラリで '__gxx_personality_v0'エラーが発生する

libはビルド/インストールします。

ただし、ソースはcで、C++ではなく、__gxx_personality_v0が所属しているようです。

コードは32ビットEtch/postgres 8.1環境からのものです。

私は固執していますが、解決方法は非常に簡単です!

答えて

2

問題が実際にPostgreSQLに関連しているかどうか、またはライブラリビルドに問題があるかどうかをテストします。ライブラリをdlopen()してシンボルを解決するための簡単なプログラムです。でそれをコンパイルします。

gcc dlopentest.c -o dlopentest -ldl 

...ととして、それを実行します。

./dlopentest /path/to/my/lib.so somesymbol 

または例えば(他のオプションLD_DEBUG=help用)詳細プレフィックスLD_DEBUG=symbols用:

LD_DEBUG=symbols ./dlopentest /path/to/my/lib somesymbol 

どのシンボルにあなたのコードとそれが何のためにあるかに依存します。あなたは十分な情報を提供していません。

このテストプログラムは、ロードおよび初期化のためにpostgresql実行可能ファイルのシンボルを必要とするライブラリでは機能しません。したがって、コードが手続き型言語などの場合はロードされません。しかし、ほとんどの単純なモジュールはうまく読み込みます。のlibstdC++またはあなたが期待していない他の何かにリンクだ場合

ldd /path/to/your/library.so 

を参照するには:

またの出力を調べる必要があります。

// 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; 
} 
+0

Postregsがパッケージからインストールされています:

は、ここでのテストプログラムです。 libは私たち自身のものです。ソースはetchでうまくビルド/実行されますが、新しいサーバでビルドするとPostgresは説明どおりにエラーを出します。 Postgres 8.4は現在のSqueeze stbaleのリリースではありませんか?あなたが8.1を参照している場合、私はそれが古いです、それは私がアップグレードしようとしている理由知っている:) –

+0

ああ、申し訳ありません。私はあなたが8.4に上っていたという事実を忘れてしまい、あなたがSqueezeであなたのコードを8.1にしようとしているという印象を受けました。 –

+0

あなたのライブラリコードは 'g ++'または 'gcc'でコンパイルされていますか?システムに付属していない他のライブラリにリンクしていますか?単純なテストプログラムは問題なくライブラリをdlopenすることができます。つまり、PostgreSQLでロードされたときにのみ問題になるか、実際にカスタムライブラリをロードする際の問題ですか? –

関連する問題