编译和链接

本文详细解析了C语言程序编译与链接的过程,解释了预处理、编译、汇编和链接四个阶段的工作原理及各自作用。重点讨论了大型项目开发中,如何通过多个源代码文件组成程序,以及编译过程为何需要分阶段进行,同时阐述了目标代码的形成及其作用。
平时,我们口头上并不严格区分“编译”(compile)与“链接”(link)这两个专业术语。例如我们总是说“把那个C文件编译成可执行文件......”,写成命令就是:

$gcc example.c

       这个命令马上给我们产生一个“a.out”(如果程序没有错误的话)。

       实际上,整个工作至少要分成四个阶段,分别由不同的程序完成:

       第一阶段:由预处理程序(unix的预处理程序通常是cpp)执行C源文件的预处理指令;

       第二阶段:C编译器把经过预处理的C代码文件编译成汇编代码文件。

       第三阶段:汇编编译器(GAS)把汇编代码文件编译成目标代码文件(以.o为后缀)。

       第四阶段:链接程序(LD)把所有目标代码链接起来产生可执行文件。

       所以,编译(包括第一、二、三阶段)和链接(第四阶段)是两回事。

       为什么搞得这么复杂?这是因为C语言是用来进行大型项目开发的系统语言,它必须允许很多人合作开发一个项目,所以,一个C程序可以分开由很多个源代码文件组成,不一定非得把所有代码都放在同一个文件里。这样就要求编译过程必须分成某些步骤,因为既然源代码由很多个文件组成,那就是说每个单独的源文件都不可能包含所有的程序代码,所以根本不可能要求编译器仅仅根据其中某一个C文件就直接产生可执行文件,它肯定要等到所有的代码文件都完成编译才有可能输出最后的执行文件。

       事实上我们以前编写的程序就是由多个文件组成的,main函数和其他我们自己定义的函数自然就是由我们自己来编写,其他的一些函数,例如printf,我们一样能使用,但我们从来没有编写过printf。像printf这些函数作为C语言标准库的一部分,已经由其他人(通常是编译器厂商)写好了并编译成库文件,我们的代码编译后只需和这些库进行链接就可以产生可执行文件。

       从前面的讨论我们大概明白C代码经过编译会产生目标代码,这个目标代码又是什么呢?还记得我们把一些C代码编译成汇编代码吗?仔细观察汇编文件就不难得出结论,目标代码其实已经是以机器码的形式存在,只不过还有一些符号的地址需要链接时才能解决。举个例子:

/*Example C code*/

#include<stdio.h>

int main(void)

{

       extern int a;

       printf(“a=%d\n”, a);

       return 0;

}

$gcc –S test.c

$cat test.s

       .section   .rodata

.LC0:

       .string     “a=%d\n”

       .text

.globl main

       .type       mian, @function

main:

       ...

       movl       $.LCO, (%esp)

       movl       a, %eax

       movl       %eax, 4(%esp)

       call         printf

       ...

       编译程序要做的事情之一就是把所有需要确定地址的符号($.LC0aprintf)记录下来,然后链接程序在找到它们的定义点之后通过计算给与合适的地址。当所有符号都有确定的地址时,链接程序就能够产生可执行文件。如果还有符号不能确定地址(找不到定义或重复定义)链接程序就会报错。例如对上面的C程序:

$gcc test.c

马上就有出错信息:undefined reference to ‘a’

       因为我们根本没有定义变量a,链接程序自然就不可能确定a的地址,于是出错退出,最终的可执行文件也无法生成。如果我们再写一个C文件如下:

/*Example C code 2*/

int a = 1;

执行:

$gcc test.c test2.c

外部变量在test2.c中得到定义,链接程序可以确定a的地址,顺利产生可执行文件a.out

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值