3

我正在尝试在 android NDK 上进行开发。我实际上有一个带有模块的项目 + 子文件夹(编译为静态库)并与主项目文件(libs .a + main object .o --> 可执行文件)链接在一起。一切都通过 ndk-build 完成。

我正在尝试使用构造函数,在挖掘了几个小时后,我发现只要不调用该库(.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 语句中是否有问题,避免了在 .a 加载时间执行构造函数?我该如何解决?

编译拇指:

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 回答