若是你是一個sdk的開發者,那麼so與符號的問題必定要清楚。c++
關於符號的基本知識:
http://blog.csdn.net/wuzoujing/article/details/56674000
函數
每一個so都有本身的符號,所謂的函數和結構體變量之類的,其實本質上都是地址,若是一個so依賴了另一個so,那麼本身的符號信息也會寫入另一個so暴露的符號,編譯時候會根據本身的符號信息去本身和依賴的so中尋找對應的符號。那麼若是是一個so A本身依賴一個標準的c++庫,而後被so B依賴,link時候創建了符號間的依賴,若是so A在一個另一個編譯鏈下依賴了另一種c++庫,這時候從新link a 和b時候,就會由於c++標準庫符號的不一樣,可能發生一些符號找不到的問題,這是很是悲劇的。例如:spa
cannot locate symbol "_ZTIN10__cxxabiv115__forced_unwindE" referenced by "/system/lib64/libMegviiUnlock.so".net
控制so庫向外界暴露符號的手段是,使用ld的--version-script參數設置文件,在文件中的global參數中限制本身對外暴露的符號,這些暴露的符號必定要包含本身但願暴露給外部的接口,不然外界就沒法訪問到對應的地址了blog