linux共享库加载

参考自: <<程序员的自我修养--链接、装载与库>> 第八章 Linux共享库的组织

以下截取部分内容 (这本书比较好的讲解了从程序的链接,装载,到运行)

共享库的兼容性

linux下的共享库就是普通的ELF共享对象

更改类型 兼容性
往共享库 Hbfoo.so里面添加一个导出符号 foo2 兼容
删除共享库libfoo.so里面一个原有的导出符号 foo 不兼容
将libfoo.so给一个导出函数加一个参数,比如原来的foo(int a)变成了foo(int a,int b) 不兼容
删除一个导出函数中的一个参数,如原来的foo(int a, int b)变成了 foo(int a) 不兼容
如果一个结构类型被用于一个导出函数或导出全局变量,那么改变结构类型的长度、 内容、成员类型,如libfoo.so有导出函数foo(struct bar b),而bar的结构被改变 不兼容
修正一个导出函数中的bug, 或者改进某个导出函數的性能,但是不改变导出函数的语义、功能,行为和接口类型 兼容
修正一个导出函数中的bug, 或者改进某个导出函数的性能, 但是同时改变了导出函数的语义、功能、行为或接口类型 不兼容

共享库的版本命名

lib 主版本号 次版本号 发布版本号 .so

共享库中的符号版本

GLIBC_2.0 GLIBC_2.6

共享库系统路径

/lib
/usr/lib
/usr/local/lib

共享库查找过程

  1. 由 LD_LIBRARY_PATH 指定
  2. 由/etc/ld.so.cache 指定
  3. 默认共享库 先/usr/lib 然后/lib

环境变量及共享库的创建

LD_LIBRARY_PATH
LD_PRELOAD
LD_DEBUG

ldconfig -n sharede_library_directory

原文地址:https://www.cnblogs.com/mikeguan/p/6875621.html