2013-08-17 31 views
2

我想在android NDK上開發。 我實際上有一個項目+子文件夾模塊(編譯爲靜態庫),並與主項目文件(libs .a +主對象.o - >可執行文件)鏈接在一起。一切都通過ndk-build完成。__attribute__((__constructor__))在android

我試圖利用構造函數,挖了幾個小時後,我發現構造函數不會被調用,只要該函數沒有調用該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 
+0

首先檢查'objdump -t '的輸出,看是否lib中的符號仍然被鏈接,即使從主可執行文件調用lib中沒有函數。 – TheCodeArtist

+0

默認情況下,NDK將使用' - gc-sections':http://stackoverflow.com/a/7217034/484441。我懷疑這會丟棄包含構造函數的部分。 – nmaier

回答

0

我想,問題是,如果一些.o沒有從test.c的調用,它不會鏈接到測試可執行文件。這就是班輪對待靜態庫(.a文件)的方式。要強制所有編譯單元(又名.o文件)存在於可執行文件,使用

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

建築。您可以通過指定

LOCAL_WHOLE_STATIC_LIBRARIES := modules 

在NDK做到這一點,但我必須承認,我從來沒有與$(BUILD_EXECUTABLE)嘗試這樣做。它適用於$(BUILD_SHARED_LIBRARY)。如果出現問題,只需編寫

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

,不要忘記正確設置PATH_TO_LIBMODULES

相關問題