编译——so与符号

如果你是一个sdk的开发者,那么so与符号的问题一定要清楚。

关于符号的基本知识:
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++标准库符号的不同,可能发生一些符号找不到的问题,这是非常悲剧的。例如:

 cannot locate symbol "_ZTIN10__cxxabiv115__forced_unwindE" referenced by "/system/lib64/libMegviiUnlock.so"

控制so库向外界暴露符号的手段是,使用ld的--version-script参数设置文件,在文件中的global参数中限制自己对外暴露的符号,这些暴露的符号一定要包含自己希望暴露给外部的接口,否则外界就无法访问到对应的地址了

posted @ 2017-10-12 16:13  钢面公爵  阅读(834)  评论(0编辑  收藏  举报