0

未定義のシンボルを持つ共有ライブラリがあります

JNI_CREATEJavaVM

外部依存関係を含めるか、コンパイラにシンボルを無視するように指示する方法はありますか?

4

2 に答える 2

4

はい、コンパイラにシンボルを無視するように指示できます。

から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.
于 2013-01-28T08:09:50.240 に答える
3

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 正しい定義が弱いスタブを上書きし、正しいメッセージが得られます。

確かに、この手法は避けるようにしなければなりませんが、何度か役に立ちました。

于 2013-01-28T07:34:50.187 に答える