首页 时尚 演艺 游戏 八卦 音乐 影视 活动 热点 快讯 聚焦 综合 资讯
当前位置:首页 > 快讯 > 正文

详解源文件编译链接至可执行程序的每一步 即时焦点

2023-02-13 16:05:04    来源:腾讯云

前言

本文利用C语言介绍源文件是如何一步一步地编译、链接成为可执行程序的。


(资料图片仅供参考)

一、编译链接总述

编译链接本身分为许多个过程,但从整体上可以概括为以下三点:

程序的每个源文件分别通过编译器的编译,生成对应的目标文件。每个目标文件通过链接器链接在一起,形成一个独立单一而完整的可执行文件。链接时会在链接库内搜索C标准库及程序员个人函数库中的函数,并将其链接至可执行程序。

整体过程如下图所示:

二、编译过程

阶段I 预处理

预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预处理指令,常见的有头文件的包含,宏定义等。

经过预处理后的文件后缀会变为i,文件以i为后缀代表其已经过预处理,但未进行下一阶段的编译

1)头文件的包含

在我们写代码时,包含头文件的是必不可少的,而在预处理中:包含头文件的操作等同于拷贝头文件中的代码,随后将源文件中的代码和头文件中的代码一起放入后缀为i的文件中。

预处理前:

预处理后:

相当于将头文件中的代码拷贝至源文件的头部,同时删掉#include"head.h"其效果与下面的代码相同,此时的文件后缀为i

struct MyStruct{int a;int b;};int main(){struct MyStruct s;return 0;}

2)宏定义的替换

在预处理时,源文件中宏定义内容会在i文件中被直接替换。

预处理前:

#include#define MAX 100int main(){int a = MAX;printf("%d\n", a);return 0;}

预处理后:

预处理后MAX会被直接替换为100,同时删除前面的#define MAX 100,其效果与下图代码相同。

3)注释的删除

在预处理时,编译器还会删除//后面的内容以及被/* */包括起来的内容,以便于接下来的编译阶段。

如图:

4)阶段总结

可以看到,不管是头文件、宏定义、还是注释,都是编译器对文本的操作。

因此可以说:预处理阶段是编译器对文本的操作阶段

阶段II 编译

当源文件经过预处理后,便开始第二个阶段——编译,经过编译的文件的后缀将变成s,文件后缀为s代表其已经经过第二阶段的编译,但未进行汇编操作

编译阶段会将C语言代码进行语法分析词法分析词义分析,以及符号汇总

1)主要操作

语法分析:检测是否有语法错误,检测语法格式是否正确等。词法分析:拆解语句或字符为关键字等。语义分析:翻译每条语句或关键字的意义。符号汇总:将代码中涉及的符号进行汇总,以便于在汇编阶段中形成符号表。

2)阶段总结

编译阶段从整体上看是对C语言代码进行分析解读由于该阶段涉及编译的原理,因此只了解大概即可,详见书籍《编译原理》。

阶段III 汇编

当源文件经过第一、二阶段后,便开始第三个阶段——汇编,经过汇编的文件的后缀将变成o或obj,即开头所说的目标文件,文件后缀为o或obj代表其至少已经经过三个阶段的编译

PS:在VS环境下生成的目标文件后缀为obj,在GCC环境下生成的目标文件后缀为o

1)主要操作

将汇编代码翻译成二进制指令。形成符号表。

2)符号表详解

在第二阶段的编译中会将代码中的全局变量函数名等汇总,并在汇编阶段形成类似一张表格。

收集以下代码中的全局变量与函数名:

形成表格:

符号表的详细作用在链接时详细介绍。

...

val

0X0012FF40

add

0X0012FF80

main

0X0012FF20

三、链接过程

链接主要包括合并段表符号表的合并及重定位两大过程。

下面依次介绍。

I 合并段表

在源文件经过编译过程后文件后缀变为oobj后,其内部的代码已经变成二进制。

此时,文件会将内部的二进制代码按类型划分成许多部分,每一部分就被称为一段。

如图:

前文我们说到,多个目标文件经过链接器后整合为一个独立而完整的文件,因此链接中合并段表的意思就是把多个目标文件中对应的段,合并在一个目标文件内

II 符号表的合并

顾名思义,将每个目标文件中的符号表合并成一个目标文件的符号表。

III 符号表的重定位

如果在写代码时发生函数定、声明、使用等不在同一源文件等情况,那么多个目标文件的符号表中可能都会有相同的函数名及无效的地址,像这样:

如上图,在两个文件中都有add的存在,那么,在head.obj源.obj的符号表中都会有收录add。

但因源.c中没有对add进行实现,因此在汇总源.c的符号表时,其地址会被填入一个无效的地址

在链接过程中,链接器不仅会对符号表合并,也会将多余的符号删除,同时将每个符号的地址都定位为所有地址中有效的那一个

IIII 找不到符号报错

如果在写代码时不小心将函数名写错了,像这样:

那么由于在head.h汇总符号表时找不到代码实现,就会把Add的地址赋为一个无效的地址,像这样:

Add

0X00000000

add

0X0012FF40

但是,在符号表的重定位时,也没有重定位Add的有效地址,那么链接就无法完成,就会报出典型的错误:

PS:函数声明extern的作用就是告诉编译器,遇到无法解释的符号先别急着报错,后面会有定义的。

四、全文总结

多个源文件经过预处理(头文件包含、宏定义替换、注释的删除),编译(语法分析、词法分析、词义分析、符号汇总),汇编(二进制指令翻译、形成符号表)后成为一个目标文件。

多个目标文件在链接库的帮助下完成合并段表,符号表合并,符号表重定位后整合为一个目标文件。

到最后变成一个可执行的exe文件。

感谢您的阅读与耐心~

汇编语言 编程算法

猜您喜欢
  • 详解源文件编译链接至可执行程序的每一步 即时焦点
    详解源文件编译链接至可执行程序的每一步 即时焦点
    预处理,又叫预编译,源文件在进入编译器后要首先进行预处理操作,告诉编译器如何预处理的代码被称为预... 2023-02-13
  • 微头条丨SE手游《圣剑传说  ECHOES of MANA》将于5月停服
    微头条丨SE手游《圣剑传说 ECHOES of MANA》将于5月停服
    SE官方今日宣布,旗下ARPG手游《圣剑传说ECHOESofMANA》将于2023年5月15日停服,官方对此表示遗憾,认为... 2023-02-13
  • 网剧《与卿书》剧情介绍_天天报道
    网剧《与卿书》剧情介绍_天天报道
    网剧《与卿书》定档2月14日情人节开播,该剧由黄羿、王弘毅、柯颖、刘胤君主演,当武力值爆棚的桃花坞阿... 2023-02-13
  • 小朋友缺铁的影响_儿童缺铁的影响
    小朋友缺铁的影响_儿童缺铁的影响
    1、小朋友如果身体内缺少铁元素的话,则是会直接影响儿童的学习能力,还会影响儿童的大脑发育,影响智力... 2023-02-13
  • 宝宝能不能吃蓝莓_蓝莓李果孕妇可以吃吗 当前热文
    宝宝能不能吃蓝莓_蓝莓李果孕妇可以吃吗 当前热文
    1、这其实问的就是宝宝可以吃梅子果脯吗岁以上的小宝宝可以适量吃些杨梅,杨梅中含有丰富的维生素、蛋白... 2023-02-13
  • 环球动态:卡西欧gshock闹钟怎么设置_卡西欧g shock闹钟设置
    环球动态:卡西欧gshock闹钟怎么设置_卡西欧g shock闹钟设置
    1、1按MODE键,将界面切换至闹钟模式(即时间下方有ALM个小英文字母的界面)。2、2长按ADJUST键,会出现SET 2023-02-13
  • 每日信息:自然堂素颜霜怎么用_自然堂素颜霜怎么用才正确
    每日信息:自然堂素颜霜怎么用_自然堂素颜霜怎么用才正确
    1、自然堂素颜霜在洗脸后用了爽肤水和乳液之后用,取适量的自然堂素颜霜均匀的擦在脸上,即可呈现出素颜... 2023-02-13
  • 茶籽油的作用与功效_茶籽油的作用 环球快资讯
    茶籽油的作用与功效_茶籽油的作用 环球快资讯
    1、其实在生活中我们都会发现茶籽油中含有非常多的营养价值,比如说它含有些不饱和脂肪酸达到90%以上,... 2023-02-13
  • 《你是我的永恒星辰》林小笛身世|天天讯息
    《你是我的永恒星辰》林小笛身世|天天讯息
    《你是我的永恒星辰》正在热播中,剧中的男主因为小时候在孤儿院被一个叫小星星的女生拯救过,所以长大... 2023-02-13
  • 《你是我的永恒星辰》陆宇恒家庭背景 天天讯息
    《你是我的永恒星辰》陆宇恒家庭背景 天天讯息
    《你是我的永恒星辰》中在陆字恒两岁的时候,因为海难,家人遇难被送入孤儿院,所以陆字恒对水有很深的... 2023-02-13
  • 当前最新:《武林有侠气》唐恒人物解析
    当前最新:《武林有侠气》唐恒人物解析
    《武林有侠气》正在热播中,剧中的女主是人参小仙出入江湖总想找一个人可以陪着自己,但是她运气不好还... 2023-02-13
  • 长安欧尚Cosay 3的优缺点 长安欧尚Cosay 3怎么样?
    长安欧尚Cosay 3的优缺点 长安欧尚Cosay 3怎么样?
    孪生兄弟或许欧尚这个名字对我们来说有些陌生,以至于欧尚在市场上的表现依然不温不火。从名字就不难看... 2023-02-13
  • 世界要闻:精华霜可以当面霜吗_精华霜可以当面霜用吗
    世界要闻:精华霜可以当面霜吗_精华霜可以当面霜用吗
    1、精华霜可以当面霜用。2、精华霜相当于精华和面霜结合后的种护肤品,既能补水也能锁水,所以精华霜可... 2023-02-13
  • 肉苁蓉玛卡泡酒方法_肉苁蓉和玛卡泡酒有什么功效与作用
    肉苁蓉玛卡泡酒方法_肉苁蓉和玛卡泡酒有什么功效与作用
    1、以玛卡50克、苁蓉50克,将准备好的玛卡、苁蓉洗净、切片(切片有利于泡出药味),倒入玻璃罐内,再加入... 2023-02-13
  • 环球今亮点!白芸豆酵素的功效与作用_白芸豆酵素副作用
    环球今亮点!白芸豆酵素的功效与作用_白芸豆酵素副作用
    1 钰媚人白芸豆酵素这款产品适合的人群是比较广泛的,因为这款产品是款纯绿色的食品,而且是保健食品,不... 2023-02-13
  • 全球速讯:红豆薏米茶喝多久见效果_红豆薏米茶喝多久见效啊
    全球速讯:红豆薏米茶喝多久见效果_红豆薏米茶喝多久见效啊
    1 因人而异。2 红豆薏米茶主要是用来祛湿的,而祛湿的时间并不具体,主要看个人的身体吸收情况、体内湿气... 2023-02-13
  • 冻龄的方法_什么是冻龄手术
    冻龄的方法_什么是冻龄手术
    1 50岁的冻龄方法:第一饮食方面要科学尽量清淡点,可以多吃能够抗“老的食物,蔬菜和水果定不能少。2 ... 2023-02-13
  • 《仙剑7》DLC“人间如梦”2天倒计时 有新故事角色等_全球新动态
    《仙剑7》DLC“人间如梦”2天倒计时 有新故事角色等_全球新动态
    《仙剑奇侠传七》官方发布新DLC“人间如梦”上线2天倒计时图。DLC将包含新故事、新系统,新角色和新地图... 2023-02-13
  • 《骑着鱼的猫》原著小说
    《骑着鱼的猫》原著小说
    《骑着鱼的猫》是由沈文帅任总导演、萧昊鹏任导演,吕小雨、罗正主演的国风治愈甜宠剧,改编自网络小说... 2023-02-13
  • 《骑着鱼的猫》播出平台
    《骑着鱼的猫》播出平台
    《骑着鱼的猫》是由长信传媒出品,沈文帅任总导演、萧昊鹏任导演,吕小雨、罗正主演的国风治愈甜宠剧。... 2023-02-13
  • Copyright © 2008-2015 当代娱乐网版权所有   Inc. All Rights Reserved.    联系邮箱:55 16 53 8 @qq.com  京ICP备2021034106号-22