12 11月 2013

[Linux/Android] Export API for SharedLibrary (.so)

當開發一個 SharedLibrary (.so) 時,不想 Export 太多 API 出去(可能涉及商業機密或是單純的爽字),Windows or Linux 都有做法可以做到,這邊只說明一下 Linux / Android 的做法。

用 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

沒有留言: