深入理解计算机系统-链接篇

    在linux系统下,很多开源C\C++程序的编译规则都是以makefile文件的形式给出。我刚开始学习makefile规则是看陈浩的《跟我一起学makefile》,后来看《深入理解计算机系统》这本书,对编译链接有了更加深入的了解。本文主要介绍程序编译的过程和原理,内容基于《深入理解计算机系统》这本书。

本文还未完成,持续更新中,目前进度为介绍一个简单gcc命令的的执行过程。

    在阅读C/C++相关书籍时,一般都会介绍在linux系统下使用gcc命令编译简单的小程序。例如,当我们在sum.c文件中实现加法操作的函数,并在main.c中调用sum.c中的函数,当代码写完后通过如下命令编译:

gcc -Og -o prog main.c sum.c

上述例子将main.c和sum.c编译为可执行文件prog,实际是经历了如下几步:

cpp [other arguments] main.c /tmp/main.i #将main.c翻译为一个ASCII码的中间文件
cc1 /tmp/main.i -Og [other arguments] -o /tmp/main.s   #将中间文件翻译为汇编文件
as [other arguments] -o /tmp/main.o /tmp/main.s  #将main.s 翻译为可重定位目标文件
... #相同程序生成sum.o
ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o 
#运行链接程序ld,将main.o和sum.o以及一些必要的系统目标文件组合起来,创建可执行目标文件prog

一.静态链接

    ld命令以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的,可以加载和运行的可执行目标文件作为输出。其主要完成两个任务:

1.符号解析,将每个符号引用和一个符号定义关联。

2.重定位,生成从地址0开始的代码和数据节,通过把每一个符号定义与一个内存位置关联起来,从而重定位这些节。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值