在一些業務場景下,需要對動態庫的大小進行限制,主要有如下幾種方法:
1. 編譯選項使用-Os,表示以最小化大小爲優化方向
2. 去除-g選項,進而去除調試信息
3. 通過strip裁剪符號及調試信息
4. 只導出必要符號
Linux默認導出所有符號,並不僅僅導出你開放的接口!
定義如下宏:
#define SYMBOL_EXPORT __attribute__ ((visibility("default")))
在你想導出的符號前加上SYMBOL_EXPORT就好。
同時,需要在腳本中增加如下編譯選項:-fvisibility=hidden
譬如:導出符號是int add(int a, int b);那麼添加的結果就是SYMBOL_EXPORT int add(int a, int b);
通過這種方式只導出想導出的符號,也可以減小庫大小。
備註
“default”:用它定義的符號將被導出,動態庫中的函數默認是可見的。”hidden”:用它定義的符號將不被導出,並且不能從其它對象進行使用,動態庫中的函數是被隱藏的。
default意味着該方法對其它模塊是可見的。而hidden表面該方法符號不會被放到動態符號表裏,所以其它模塊(可執行文件或者動態庫)不可以通過符號表訪問該方法。