用 nm 觀察 .so 的 Symbol Table
nm -gC MyLib.so
- -g : 只列出 external symbol
- -C : 將 C++ 的 symbol 轉換成易讀的版本
Android NDK 在 toolchain 的 prebuild 資料夾裡,也有 ARM/x86 的 nm.exe 可以使用
比如,在我的 Windows x64 NDK 底下
%NDK_PATH%/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/arm-linux-androideabi/bin/nm.exe
記得,不同的 ABI Type,要用相對應的 folder 底下的 nm.exe 才行。
在 GCC or G++ 的參數加上 -fvisiblity=hidden,這樣所有的 API 的 visiblity 預設都會是 hidden,接著,只要在想要 Export 的 API 前加上 __attribute__ ((visibility ("default"))) 就搞定了。
Android.mk
LOCAL_CFLAGS := -fvisibility=hidden
MyLib.cpp
#ifdef __GNUC__ #define DLL_PUBLIC_API __attribute__ ((visibility ("default"))) #define DLL_LOCAL_API __attribute__ ((visibility ("hidden"))) #else #define DLL_PUBLIC_API __declspec(dllexport) #define DLL_LOCAL_API #endif DLL_PUBLIC_API void MyFunc1() {/*...*/} DLL_LOCAL_API void MyFunc2() {/*...*/} void MyFunc3() {/*...*/}將 build 出來的 MyLib.so 丟給 nm parse 看看
應該就只能在 Symbol Table 裡看到 MyFunc1 了
Reference
- StackOverflow - How do I like symbol in a .so file
- GCC Wiki - Visiblity
1 則留言:
張貼留言