程序的链接和装载
文章平均质量分 85
三井申
talk is cheap
展开
-
程序的链接和装载(6)--链接过程控制
正常情况下,我们使用链接器的默认规则对目标文件进行链接是没问题的。但是在一些特殊的场景,比如操作系统内核,BIOS,嵌入式软件,BootLoader,内核驱动程序下,因为一些受限制的条件,我们需要显示的指明程序的各个段的起始地址,段的名称,段存放的顺序等等。 而且连接过程中有很多内容需要我们显示的确定,比如该使用哪些目标文件,使用哪些库文件,是否在最终的可执行文件中保留调试信息,输出哪种文件格式(可执行程序还是动态链接库程序)等等。 因此这些场景下我们需要自己控制链接的过程。控制...原创 2021-10-14 17:11:48 · 281 阅读 · 0 评论 -
程序的链接和装载(5)--静态链接
通过前文我们已经对目标文件和符号有了一个较为清晰的理解,接下来,我们将以下面两个源文件作为一个例子阐述一下静态链接的处理过程。/* a.c */extern int shared;extern void swap(itn *a, int *b);int main(){ int a = 100; swap(&a, &shared); return 0;} /* b.c */int shared = 1;void swap(int *a, ...原创 2021-10-14 17:07:34 · 162 阅读 · 0 评论 -
程序的链接和装载(4)--符号
正如我们前文所提到的,符号是链接过程的粘合剂,它为众多目标文件提供接口,使得众多目标文件能够正确的链接在一起。因此,本文我们将详细介绍符号表的内容已经符号在链接过程中的作用。 1. ELF符号表结构 目标文件中的符号表其实也是一个段,段名往往叫作“.symtab”,类型为SYMTAB,符号表也是一个结构体数组,每个符号的结构体如下所示,它包含了该符号的符号名,所在段的索引,该符号的值,该符号的长度等等信息。 符号绑定属性分为STB_LOCAL,STB_G...原创 2021-10-14 17:02:47 · 299 阅读 · 0 评论 -
程序的链接和装载(3)--目标文件(.o/.obj)
我们经过编译的目标文件,里面到底存放的内容是什么呢?其实,目标文件本身已经是编译后的可执行文件了,只是还没有经过链接,所以内部很多符号还没有分配地址。其实目标文件本身就是按照可执行文件的格式进行存储的,只是目标文件和可执行文件在文件结构上略微有些区别。 1.目标文件的格式 目前主流的pc平台所流行的可执行文件格式主要分为两种,一种是Windows下的PE(Portable Executable),另一种是Linux下的ELF(Executable Linkable Format),它...原创 2022-01-09 17:27:17 · 924 阅读 · 0 评论 -
程序的链接和装载(2)--链接概述
为了能够更好地理解计算机程序中编译和链接的过程中,我们简单地回顾一下计算机程序开发的历史。在最开始的时候,计算机程序的开发并没有如此庞大复杂的自动化编译链接构建工具来帮忙,那个时代的程序员,往往是先把程序写在卡带上,再由计算机读取卡带中的点阵来执行程序。所以当时并没有现如今功能如此强大的编程语言,而是使用机器语言进行编程。 假设我们的计算机,每条指令占1个字节8bit,而有一种跳转指令,高4位为0001,表示该指令为跳转指令。低4位表示指令跳转的绝对地址。那么从如下机器码中我们可知,地址0...原创 2021-10-14 16:40:11 · 194 阅读 · 0 评论 -
程序的链接和装载(1)--被隐藏的处理
在当今这个时代,我们有着各种各样非常强大的集成开发工具,得益于它们那些强大的诸如符号解析,引用构建,代码补全,一键式编译,类库支持等等功能,我们可以从工程本身的结构中抽身出来,专注于业务和功能。但是,不好的一点在于,对于很多新手来说,IDE便成为了一个夹在源代码和可执行文件中间的黑盒,那些被隐藏的处理一旦出现了错误,他们往往不知道如何去解决这些问题。 以下面这段几乎每个程序员都能闭眼写出的HelloWorld而言,在linux下当我们执行 "gcc Hello.c -o Hello"后,最...原创 2021-10-14 16:29:03 · 168 阅读 · 0 评论 -
程序的链接和装载(0)--引言
相信绝大多数程序员都有着和我相似的经历:在大一的时候,在一门或者叫做《程序设计基础》或者叫做《C语言》的课程里,写下了人生第一个程序,然后点击着VC6那个经典的运行键,看到屏幕上打出了一行“Hello World”。那个时候并不会想太多,总觉得写好代码,按下运行键,看着屏幕弹出的cmd窗口打印着我写下的逻辑,这一切似乎都是那么理所当然。 后来学习了更多知识,知道了计算机体系结构,知道了操作系统,知道了编译原理,知道了我们的C代码是依靠编译器编译成了二进制的机器码,才能再计算机中运行。...原创 2021-10-14 15:26:12 · 134 阅读 · 0 评论