c/c++ 链接、链接器

链接



链接:将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存中。


编译器作用:  .c -> .i -> .s -> .o


可重定位目标文件(.o):

包含二进制代码和数据,可和其他可重定位目标文件合成 可执行文件

可重定位目标模块里面有一个符号表,包含定义和引用的符号的信息


可执行文件:包含二进制代码和数据,可以直接被复制到内存并执行。


共享目标文件:特殊可重定位目标文件,可在加载或运行时被动态地加载进内存并链接。



静态链接:步骤是 符号解析 和 重定位


静态库:.a ,是由很多.o合并而来


符号解析:符号对应一个函数、全局变量或是静态变量。符号解析作用是将每个符号引用和符号定义关联起来。


重定位:关联之后,重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。这样每个引用就能在内存中找到定义


链接器:

只复制被调用的目标模块(函数),减少可执行文件在内存中的大小。

链接器用库来解析其他目标模块中的符号引用。

许多链接器从左到右顺序扫描解析符号引用,顺序可能会引起链接错误。



动态链接


动态库: .so, 调用动态库的可执行文件可在内存中共享这个库的代码和数据,而不会复制。


当创建可执行文件时,静态执行一些链接,然后在程序加载时,动态完成链接过程。可执行程序只是复制走了一些重定位和符号表信息,使得运行时可以解析对.so中代码和数据的引用。


链接动态库

先运行一个 加载器(将可执行文件的内容映射到内存,并运行这个程序), 再运行 动态链接器。动态链接器 执 行 重定位.so的文本和数据到某个内存段,再重定位可执行程序中所有对.so定义的符号的引用 来完成链接任务。


还可以在程序中加载和链接动态库!!软件更新很多就是这么做,调用dlopen函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值