若是你是一个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