• 首页
  • 粮食
  • 蔬菜
  • 果品
  • 水产
  • 酒水
  • 饮料
  • 茶叶
  • 畜禽
  • 食用油
  • 资讯
logo
  • 首页>
  • 粮食 >
  • 正文

详解源文件编译链接至可执行程序的每一步 当前关注

2023-02-13 17:00:42 来源:腾讯云

前言

本文利用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 合并段表

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

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

如图:

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

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
  • 俄乌冲突进入绞肉机模式,俄罗斯在过去两周遭遇最惨烈的伤亡!2月12日,根据英国国-世界微动态

    粮食2023-02-13
  • 什么叫批捕犯罪嫌疑人,法律上该如何规定 天天观热点

    粮食2023-02-13
  • 美股三大指数收盘涨跌不一,热门中概股普跌,哈喽被罚36万

    粮食2023-02-13
  • 我国对外服务需求逐渐复苏 经济增长溢出效应更大

    粮食2023-02-13
  • 不锈钢防护门合同范本(优选9篇)

    粮食2023-02-13
  • 实时焦点:男子跳高 世界记录_男子跳高世界记录

    粮食2023-02-12
  • 墨竹画_墨竹文集 当前热点

    粮食2023-02-12
  • 世界微动态丨天气预报|12日降温降雨将至 2月下旬将比去年温暖

    粮食2023-02-12
  • 三价铁离子催化过氧化氢_三价铁离子的颜色-每日热讯

    粮食2023-02-12
  • 古代书签女送男意义-每日快报

    粮食2023-02-11
  • 天天快消息!不动产登记中心开启存量房“带押过户”新模式

    粮食2023-02-11
  • Lava Blaze 5G手机配天机700宣布售价约为卢比10000

    粮食2023-02-11
  • 全球信息:充分发挥大豆在我国食物系统中的独特价值

    粮食2023-02-11
  • 《永乐大典》高清影像数据库在京发布

    粮食2023-02-11
  • 光明高级中学和光明中学哪个好_光明新区高级中学好不好

    粮食2023-02-11
  • 国内资讯丨2022年度绿色制造名单公示

    粮食2023-02-11
  • 香港代购怎么做赚钱?做代购的那些事

    粮食2023-02-11
  • 为什么送外卖过来的薯条都是弯的

    粮食2023-02-10
  • 张晓平_关于张晓平的介绍 全球时快讯

    粮食2023-02-10

果品

  • 吃一颗杨梅等于吃10条虫子? 专家提醒:这些说法对不对?
  • 北京2022年冬奥会、冬残奥会奖牌“同心”正式发布
  • 冬奥故事会丨一图了解冬奥会历届奖牌
  • 同心筑梦向未来——写在北京冬奥会开幕倒计时100天之际
  • 外交部:美国针对亚裔仇恨犯罪数字令人痛心

蔬菜

  • 说好“一梯一户”却成了“两梯两户”,买方能否解除合同?
  • 更高水平开放合作助力中国东盟经贸发展迎新机遇
  • 9被告人犯侵犯著作权罪被判刑罚
  • 玉渊谭天丨中美再通话,“建设性”很重要
  • 环球时报社评:中美经贸需要建设性对话
  • 俄媒:莫斯科扩大新冠感染新疗法试点范围
  • 冰雪之约 中国之邀 | 追赶的勇气
  • 中国第20批赴黎维和建筑工兵分队完成“VA-2”道路排水系统修缮任务
  • 中国常驻联合国代表团举办恢复联合国合法席位50周年图片展
  • 美专家认为三大原因导致美国供应链危机

Copyright   2015-2022 亚太食品网 版权所有  备案号:沪ICP备2020036824号-11   联系邮箱: 562 66 29@qq.com