我们在编译自己的```SO```库时,存在两类使用```SO```库的情况,**显式加载**和**隐含加载**
如果**显式加载**,则在合适的时机,在自家```SO```库的API执行过程中,需要主动加载依赖```SO```库,并查找函数名称,获取函数指针,然后进行调用。
**隐含加载**,在编译自家库的时间,只需要对方的头文件接口```API```,不需要指定```-lsoname```的依赖```SO```库的编译选项;但在自家库被链接成为可执行程序时,则需要指定```-lsoname```,让编译器生成代码,进行隐含加载依赖```SO```库的过程,并重新修改库函数调用地址。
注意:在生成可执行程序时,因为涉及到了具体的```SO```库,如果```SO```库中还携带了``soname```的标识字段,则程序启动执行的时间,会按照链接时依赖库中的```soname```字段指示信息,寻找加载的```SO```库。
通常```soname```字段信息中携带了更具体的版本号,而编译选项```-lsoname```只是一个库名字,或甚至仅是一个软连接!
本文探讨了软件开发中如何在编译时区分显式加载SO库(通过API直接调用)与隐式链接(在运行时动态查找)。讲解了显式加载时主动查找函数指针的方法,以及隐性链接中soname字段的作用,以及它如何影响程序启动和库版本管理。
2787

被折叠的 条评论
为什么被折叠?



