未定義のシンボルを持つ共有ライブラリがあります
JNI_CREATEJavaVM
外部依存関係を含めるか、コンパイラにシンボルを無視するように指示する方法はありますか?
未定義のシンボルを持つ共有ライブラリがあります
JNI_CREATEJavaVM
外部依存関係を含めるか、コンパイラにシンボルを無視するように指示する方法はありますか?
はい、コンパイラにシンボルを無視するように指示できます。
からman ld
、
--unresolved-symbols=メソッド
未解決のシンボルの処理方法を決定します。method には 4 つの可能な値があります。
ignore-all
Do not report any unresolved symbols.
report-all
Report all unresolved symbols. This is the default.
ignore-in-object-files
Report unresolved symbols that are contained in shared
libraries, but ignore them if they come from regular object files.
ignore-in-shared-libs
Report unresolved symbols that come from regular object
files, but ignore them if they come from shared libraries.
1)(テレパシーモードがオンの場合)libdvm.soをビルドしようとしていて、JNI_CREATEJavaVM関数を公開しないJava NDKをハックしようとしていると思います。やらないでください。なぜそうでないのか、他の可能な解決策は何ですか。
2) あなたの質問は「管理方法」のように聞こえるので、そのようなものを管理するための私のお気に入りの方法を紹介します。何を構築するかは問題ではないので、共有ライブラリの構築から一歩踏み出しましょう。コードを含む undesym.c ファイルがあるとします。
int
main(void)
{
JNI_CREATEJavaVM();
return 0;
}
エラーが発生しundefined reference to `JNI_CREATEJavaVM'
ます。
偽の弱いスタブを使用してリンク モジュール fakeone.c に追加します。
#include "assert.h"
int __attribute__((weak))
JNI_CREATEJavaVM(void)
{
assert(0 == "stub JNI_CREATEJavaVM is not for call");
return 0;
}
これですべてが正常にリンクされますが、スタブ呼び出しで実行時アサーションが生成されます
a.out: fakeone.c:6: JNI_CREATEJavaVM: Assertion `0 == "stub JNI_CREATEJavaVM is not for call"' failed
でもなんで弱いの?誰かがそれを実際の JNI_CREATEJavaVM コードとリンクしていると考えてください。たとえば、goodone.c を試してください。
#include "stdio.h"
int
JNI_CREATEJavaVM(void)
{
printf("JNI_CREATEJavaVM Ok\n");
return 0;
}
そしてコンパイルすると、gcc undesym.c goodone.c fakeone.c
正しい定義が弱いスタブを上書きし、正しいメッセージが得られます。
確かに、この手法は避けるようにしなければなりませんが、何度か役に立ちました。