深入理解计算机系统:链接

本文详述了计算机系统中的链接过程,包括链接器的主要任务——符号解析和重定位。探讨了可重定位目标文件(.o文件)、可执行目标文件(.out文件)和共享目标文件(.so文件)的区别,并通过实验分析了它们的特性,如.bss与COMMON节的区别,以及如何使用readelf和objdump工具进行分析。
摘要由CSDN通过智能技术生成

深入理解计算机系统之链接

在学习《深入理解计算机系统》学到链接的时候,关于课上内容以及代码实践加上自己理解,整理了以下内容。
首先,一个C语言程序,会经过预处理,编译,汇编,链接最终形成一个可执行的目标文件。
而链接器的主要任务就是:

  • 符号解析:将每个符号引用正好和一个符号定义关联起来(全局量即为符号,如全局变量,静态变量和函数)

  • 重定位:即是将符号与一个内存位置关联起来,即在一块连续的虚拟地址空间内,为符号重新分配了地址,即重定位(合并.o文件,确定每个符号的地址,在指令上填入新的地址,详细区别下文讲解)

    而目标文件有三种形式,分别是:

  • 可重定位目标文件

  • 可执行目标文件

  • 共享目标文件

这三者的区别是:

  • 可重定位目标文件(.o文件):包含二进制代码和数据,是由一个.c文件经过预处理,编译,汇编得到的。
    main.c --预处理器(cpp)–>main.i --编译器(ccl) -->main.s —>汇编器(as)—>main.o —>连接器(ld)—> main
    此次实验是以ELF可重定位目标文件为例。(如下所示)
    ELF

特别提出的是.bss和COMMON节的区别:
(1): .bss中存放的是未初始化的全局和静态C变量以及所有被初始化为0的全局或静态变量,未初始化的默认为0
(2): COMMON节中存放的数据则是不会给予默认值,假如是未初始化的指针符号,则会放在COMMON节而不是bss节

  • 可执行目标文件(.out文件):包含二进制代码和数据,可以被直接复制到内存并执行。即由.o文件经过链接后形成的文件。可以在ubantu终端输入指令 gcc -Og -o fun main.c sum.c (-Og代表可调试,-o 后面跟程序名)
  • 共享目标
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值