linux 静态库、动态库

查看linux的.so包含哪些函数:nm *.so; readelf -a *.so
如果是ndk编译的.so,nm查看不出函数,得用readelf,因为android的.so或者可执行文件使用elf格式

  • gcc的fvisibility=hidden 可以把所有的符号(函数和变量名)强制标记为隐藏属性,符号就变成了局部符号(t) 在android中LOCAL_CFLAGS += fvisibility=hidden
    但是此时nm或者readelf是能看到所有的符号名的。
    如果要导出某些函数(T),则需要在code中显式的声明:
   void __attribute__ ((visibility ("default")))
   flipAvatar( JNIEnv*  env ) {
   
   }

然后需要隐藏局部函数名,此时nm/readelf真的看不到隐藏的符号了:

   LOCAL_PATH := $(call my-dir)
   cmd-strip = $(TOOLCHAIN_PREFIX)strip --strip-debug -x $1
   arm-linux-androideabi-strip --strip-unneeded *.so

strip unused information to shrink library in android platform:

   LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden
   LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden
   LOCAL_CFLAGS += -ffunction-sections -fdata-sections  LOCAL_LDFLAGS += -Wl,--gc-sections
   在需要导出的api前加上 __attribute__ ((visibility ("default")))

(continue)

posted @ 2015-04-15 18:02  Lcnoctave  阅读(728)  评论(0编辑  收藏  举报