关于链接的总结

函数库、链接、载入


编译过程

  • 一个编译过程包含如下步骤:

    1. 预处理器
    2. 语法和语义分析器
    3. 代码生成器:将高级语言翻译成汇编语言(即狭义上的编译过程),并生成汇编文件(.s文件)
    4. 优化器
    5. 汇编程序:将汇编代码翻译成二进制代码(即汇编过程),并生成目标文件(.o文件)
    6. 链接-载入器
  • 链接-载入器的用途

    1. 载入目标文件,并确认main函数为初始进入点(即程序开始执行的地方)
    2. 把符号引用绑定到内存地址
    3. 把所有目标问集中在一起,再加上库文件,从而产生可执行文件
  • 不论是静态库还是动态库,只有被调用到的函数才会被载入可执行文件或内存中 —— 由于整个共享库并不是被一次性载入内存的,而是根据需要,以页面为单位载入的,因此动态库(共享库)不会将不需要的函数载入内存。

  • 动态库又叫共享库

动态链接和静态链接

  • 静态链接(编译时链接):函数库的一份拷贝是可执行文件的物理组成部分,静态链接库通常是.a文件
  • 动态链接(运行时链接):可执行文件只包含了文件名,让载入器在运行时能够寻找程序所需要的函数库(只有真正调用时才会带来额外的开销),动态链接库通常是.so文件
  • 动态链接的优缺点

    • 优点: 
      1. 节省空间:可执行文件很小,更有效的利用磁盘空间
      2. 自动更新——假若更新了某个动态库,则所有使用此动态库的程序在下一启动时都会使用新版本的动态库
      3. 代码共享 —— 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝,因此动态库又叫共享库
    • 缺点: 
      1. 运行速度稍慢
      2. 函数库的路径不能随意移动——链接器通常将库文件名或路径名植入可执行文件中,除非另作说明,否则移动函数库会使程序找不到库函数的定义
      3. 兼容性问题 —— 若程序版本得到更新,但动态库依旧是老版本,则有可能产生兼容性问题,因为开发者无法在使用者计算机中的动态库进行检查。
  • 静态库使用ar,而动态库使用ld

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值