linux共享库链接过程

一 与静态库链接

1 符号解析(symbol resolution)

将符号的引用与定义联系在一起。
#引用信息和定义信息在哪儿,怎么联系在一起的
  1)内部符号解析-编译器

  2)外部符号解析-连接器

  

与静态库链接:
    链接器维护三个集合(E:可执行文件集合(U:未解析的符号集合(D:已定义的符号集合对于每一个输入的目标文件,通过里面的符号引用与定义信息来修改U、D中的值。对于库文件,若库中的文件成员m中含有对之前 U 中未解析符号的定义,则将m类似目标文件执行操作,直到U、D不再发生变化(如何判断),则将不包含在E中的目标文件舍弃。链接器完成对输入文件的扫描后,如果U非空则触发符号未定义错误。所以输入文件的顺序尤为重要。

2 重定位 (relocation)

2.1 重定位节和符号定义

  

2.2 重定位节中的符号引用

  

二 与动态库链接 

2.0 拷贝重定位和符号表信息

#不拷贝代码和数据节

2.1 重定位

2.1.1 重定位 libc.so 的文本和数据到某个存储器段。
2.1.2 重定位 p2 中所有对由 libc.so 定义的符号和引用。

加载时绑定:

调用时绑定:【为了效率】

  延迟绑定技术:
  第一次调用:引用 -> PLT -> GOT -> PLT -> linker(关键的延迟绑定代码, 回填地址至GOT表中)
  之后调用: 引用-> PLT -> GOT -> address

=============================================================

深入理解计算机系统

延迟绑定(lazy binding)
GOT(globle offset table)
PLT(procedure linkage table)

符号表 {

  每个可重定位目标文件都有一个符号表,一般的(1本模块全局符号(2本模块函数(3引用的其他模块的全局符号(4非全局符号 会生成符号信息。

  符号表数据结构:

  

重定位表{

  重定位表数据结构:

  

 linker & loader

连接器符号表条目{

  

}

原文地址:https://www.cnblogs.com/rlee063/p/8520360.html

时间: 2024-11-13 08:02:56

linux共享库链接过程的相关文章

Linux共享库的组织 -- 学习笔记

8.1  共享库的版本 共享库的更新可以被分为两类: 兼容更新.所有的更新只是在原有的共享库基础上添加以内容,所有原有的接口都保持不变 不兼容更新,共享库更新改变了原有的接口,使用该共享库原有接口的程序可能不能运行或运行不正常 这里讨论的接口是二进制接口,ABI 导致C语言的共享库ABI改变的行为主要有4个: 1) 导出函数的行为发生改变 2) 导出函数被删除 3) 导出数据的结构发生变化 4) 导出函数的接口发生变化,如函数返回值.参数被改变 共享库版本命名: Linux有一套规则链命名系统中

linux共享库

linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有一些更新,增加了一些接口符号且保持原来的接口符号不变,但保持后向兼容:主版本号和次版本号相同,发布版本号不同,表示库的一些修改修正,不增加新功能. SO-NAME软链接 SO-NAME 软链接:共享库 libname.so.x.y.z 的SO-NAME软链接命名为 libname.so.x 即去掉次

Linux 共享库(动态库)

Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 - 换句话说,它们是"完整的".因为这一原因,静态可执行程序不依赖任何外部库就可以运行. 第二类是动态链接的可执行程序. 静态可执行程序与动态可执行程序比较 我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的: # ldd /sbin/sln not a dynamic executable "not a dynamic executa

linux环境 :Linux 共享库LIBRARY_PATH, LD_LIBRARY_PATH 与ld.so.conf

参考: 1. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径.(该路径在默认路径之前查找) 移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中. 当执行函数动态链接.so时,如果此文件不在缺省目录下‘/usr/local/lib’ and ‘/usr/lib’. 那么就需要指

linux 共享库版本管理

原理 请看Linux 如何解决共享库的版本控制 我的理解 linux在系统内部将用到的共享库版本都保留下来,并没有覆盖.(不同soname) 调用程序和共享库在链接的时候已经记录下来了共享库的soname. libxx.so文件一般只是一个软链接.只是为了与gcc命令参数-lxx 中的xx名称一致.实际中可以在不同目录创建相同名字的libxx.so链接到不同soname的共享库.gcc -lxx使用-L参数指定不同目录位置,实现使用不同版本的共享库链接.在链接完成之后,libxx.so就失去了他

Linux共享库路径配置

今天在某测试服务器上使用ab压力测试工具时,出现了错误 ab: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory 查询资料,发现原因是是找不到正确的共享库路径. 参考资料: Linux共享库路径配置 /etc/ld.so.conf文件 解决方法: 1.添加搜索路径,并使用ldconfig命令更新. 查看/etc/ld.so

Linux共享库.so文件的命名和动态链接

Linux中的.so文件 是动态链接的产物 共享库理解为提供各种功能函数的集合,对外提供标准的接口 Linux中命名系统中共享库的规则 主版本号:不同的版本号之间不兼容 次版本号:增量升级 向后兼容 发行版本号:对应次版本的错误修正和性能提升,不影响兼容性 Linux中的共享库并不都是这样的格式 比如GLibc的共享库命名为:libc-x.y.z.so 动态链接器也是GLibc的一部分,使用ld-x.y.z.so命名 libm(数学库)等 SO-NAME机制 系统和程序中要链接的共享库的格式一般

windows动态链接库[DLL]与Linux共享库[SO]技术浅析

一.动态链接库的技术优点: 1)节省内存和磁盘空间:因为动态库在内存或磁盘中只需一份,便可供多个进程或程序使用. 2)模块化编程,方便协作:这一点静态库也能胜任. 3)使用动态加载DLL或SO时,便于模块升级,无需重新编译或链接整个程序. 二.windows的动态链接库: 1.windows的静态库生成的是.lib文件,其中包含了函数和数据实体,链接时合到程序中: 2.windows的动态库生成.dll文件并导出一个.lib文件,该.lib文件中的函数没有实体[不是一个 准确的说法],函数内部是

Linux共享库两种加载方式简述

动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是在程序执行时按需载入,其执行代码可以同时在多个程序中共享.由于在编译过程中无法知道动态库函数的地址,所以需要在运行期间查找,这对程 序的性能会有影响. 共享库 对于共享库来讲,它只包括2个段:只读的代码段 和可修改的数据段.堆和栈段,只有进程才有.如果你在共享库的函数里,分配了一块内存,这段内存将被算在调用该函数的进程的堆中.代码段由于其