chapter07_链接

链接是将源代码的不同部分组合成一个单一可执行文件的过程,涉及编译、加载和运行时三个阶段。链接器负责符号解析和重定位,解决不同模块间的引用关系。链接类型包括静态链接和动态链接,其中动态链接解决了静态链接中资源重复和更新的问题。文章详细介绍了ELF文件结构、符号表、强弱符号以及静态库和共享库的工作机制。
摘要由CSDN通过智能技术生成
  1. 链接

    1. 定义

      将不同部分的代码和数据,收集和组合成为一个单一文件的过程。这个文件可以被加载拷贝到存储器并执行。

    2. 发生时刻

      (1) 编译(compile time)

      源代码被翻译成机器代码

      (2) 加载(load time)

      程序被加载器load到存储器并执行时

      (3) 运行(run time)

      应用程序执行

    3. 链接由链接器(linker)的程序完成,作用是分离编译,把每个模块单独进行编译,然后再链接在一起

  2. 编译器驱动程序

    1. 编译器驱动程序包括:

      (1) 预处理器

      (2) 编译器

      (3) 汇编器

      (4) 链接器

    2. 示例

      现在有两个c文件: main.c 和 swap.c, main.c中有 main() 函数,调用swap.c中的 swap() 函数

      在 shell 下输入:

           > gcc -02 -g -o p main.c swap.c
      

      过程:

       (1) main.c ---- c预处理器 ----> main.i
      
       main.i 是一个ASCII码的中间文件
      
       (2) main.i ---- c编译器(ccl) ----> main.s
      
       main.s 是一个ASCII码的汇编文件
      
       (3) main.s ---- 汇编器(as) ----> main.o
      
       main.o 是一个可重定位目标文件
      
       同理, swap.c经过上述三个预处理、编译、汇编过程,也得到了 swap.o 目标文件
      
       (4) main.o + swap.o ---- 链接器(ld) ----> p
      
       p 是一个可执行文件
      

      当在 shell 下输入 > ./p 时,shell 会调用 os 中的加载器函数,把 p 的代码和数据拷贝到存储器,然后将控制转移到程序的开头

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值