0

セキュリティ上の理由から、プログラムを静的に soci にリンクする必要があります。

バックエンドが postgresql であるため、静的ライブラリ libsoci_core.a と libsoci_postgresql.a をビルドしました。

私の問題は、これらのライブラリを使用してプログラムをビルドすると、リンク エラーが発生することです。

[...]/lib/libsoci_core.a(backend-loader.cpp.o): 関数 `(anonymous namespace)::do_unload(std::basic_string, std::allocator > const&)':

backend-loader.cpp:(.text+0x623): `dlclose' への未定義の参照

backend-loader.cpp のコードを見ると、dlclose およびその他の動的ライブラリ ロード関数が呼び出されます。

したがって、これらのエラーを回避して「真の」静的ビルドを作成することさえ可能かどうか疑問に思っています。

または、このエラーが発生しないようにするにはどのオプションを使用する必要があり、コードは静的 posgresql ライブラリを呼び出しますか?

ありがとう!

4

1 に答える 1

1

静的にリンクされたライブラリを構築しようとしているため、dl*関数を削除/スタブアウトする必要があります。

1つの方法は、独自の関数を使用してdlstub.cファイルを作成し、それらをライブラリにリンクすることです。

(/usr/include/dlfcn.h)のプロトタイプを使用する:

#include <dlfcn.h>

int    dlclose(void *){}
char  *dlerror(void){}
void  *dlopen(const char *, int){}
void  *dlsym(void *restrict, const char *restrict){}

スタブ関数を*.oファイルにコンパイルし、コンパイルコマンドにリンクします。

gcc -c -O2 -g dlstubs.c
gcc -static ...  -o dlstubs.o ...
于 2012-07-02T09:30:27.023 に答える