linux 静态库、动态库

it2026-01-20  11

查看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)

转载于:https://www.cnblogs.com/octave/p/4429327.html

最新回复(0)