3

Android NDKで開発しようとしています。私は実際にモジュール(静的ライブラリとしてコンパイルされた)を含むプロジェクト+サブフォルダーを持ち、メインプロジェクトファイル(libs .a +メインオブジェクト.o -->実行可能ファイル)と一緒にリンクしています。ndk-build を介してすべてが行われます。

コンストラクターを利用しようとしていますが、数時間掘り下げた後、その lib (.o) の関数が呼び出されない限り、コンストラクターは呼び出されないことがわかりました。

例えば

__attribute__ ((__constructor__))
 void pre_func(void) {
        printf("pre_func2\n");
}

void my_init(){
printf ("tutto funge!");
//return 0;
}

my_init();が明示的に呼び出されたとき (およびその前) にのみ呼び出されますtest.c

$ adb shell /data/local/tmp/test
pre_func2
tutto funge!

今、私の問題は非常に単純です。アーキテクチャでは、オブジェクトがロードされたときに初期化されるように準備したいくつかのモジュールが必要です...いくつかのものを検索し(--init, _init())ましたが、どれも役に立ちません。

標準の同じコードがlinux (glibc and no bionic linker)正常に動作しているように見えるので、ロード時にコンストラクターが実行されるのを回避するコンパイル gcc ステートメントに何か問題がありますか? どうすれば解決できますか?

親指をコンパイルします。

modules <= libtest.c
    /opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-        linux-androideabi-gcc -MMD -MP -MF ./obj/local/armeabi/objs/modules/libtest.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/modules -DANDROID -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -Wa,--noexecstack  -I/opt/android-ndk-r8e/platforms/android-3/arch-arm/usr/include -c  jni/modules/libtest.c -o ./obj/local/armeabi/objs/modules/libtest.o 
    StaticLibrary  : libmodules.a
    rm -f obj/local/armeabi/libmodules.a
    /opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crs ./obj/local/armeabi/libmodules.a ./obj/local/armeabi/objs/modules/libtest.o ./obj/local/armeabi/objs/modules/module.o
4

1 に答える 1

1

.o問題は、一部が test.c から呼び出されない場合、テスト実行可能ファイルにリンクされないことだと思います。これが、ライナーが静的ライブラリ (.aファイル) を処理する方法です。すべてのコンパイル単位 (別名.oファイル) を強制的に実行可能ファイルに含めるには、次を使用します。

-Wl,-whole-archive libmodules.a -Wl,-no-whole-archive

構築するため。指定することにより、NDKでこれを実現できます

LOCAL_WHOLE_STATIC_LIBRARIES := modules

しかし、私は でこれを試したことがないことを告白しなければなりません$(BUILD_EXECUTABLE)。それはうまくいき$(BUILD_SHARED_LIBRARY)ます。何か問題が発生した場合は、単純に書き込みます

LOCAL_LDFLAGS := -Wl,-whole-archive $(PATH_TO_LIBMODULES)/libmodules.a -Wl,-no-whole-archive

PATH_TO_LIBMODULES正しく設定することを忘れないでください。

于 2013-08-18T22:53:18.413 に答える