链接 装载
文章平均质量分 59
gaoxiang__
这个作者很懒,什么都没留下…
展开
-
gcc编译器的具体处理过程
我们在linux中编译c代码的时候,都会使用gcc ***.c -o ***可是这一条简简单单的命令后隐藏着什么呢?在输入这条命令,敲击回车之后有发生了什么呢? 首先,gcc的编译过程大体上可以分成4个部分:预编译,汇编,编译,和链接。下面具体说明这些步骤主要时做了什么。 1,预编译,我们在写程序的时候一般会使用include,会使用宏定义define,使用编译选项。这些语句的处理都是在预编译原创 2015-03-24 22:43:14 · 920 阅读 · 0 评论 -
linux目标文件ELF的格式
现在PC上流行的可执行文件格式主要是windows下的PE和linux下的ELF文件,他们都是COFF格式文件变种。目标文件时源代码编译后但未进行链接的那些中间文件,它跟可执行文件的格式几乎没有什么区别,因此目标文件(.o文件)也和可执行文件使用一样的储存格式。 在linux中除了可执行文件还有几种文件也是使用ELF格式储存的,其中包括动态库文件(.so),可重定位文件(.o),核心转储文件(进原创 2015-03-25 22:43:30 · 1155 阅读 · 0 评论 -
gcc静态链接
链接就是将多个.o文件连接成为一个可执行文件的过程。链接中最终要的部分就是空间地址分配和符号的解析和重定位。 首先说空间地址分配:扫描所有的输入目标文件,获得他们各个段的长度、属性和位置,并进一步将输入目标文件的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局符号表里。在这一步中,连接器能获得所有输入段的长度,并将它们合并,计算出合并后的段长度和位置,并建立映射关系。 符号解析和重定原创 2015-04-01 22:48:28 · 849 阅读 · 0 评论 -
可执行文件的装载
程序的装载过程大体上可以分为6个步骤: 1)新建进程调用do_execve()后查找文件,找到后先读取前128字节(魔数),判断 文件类型,其中有elf、#!(脚本)、cafe(java)等; 2)在获取了文件类型后,调用相应的加载函数,处理文件的加载过程; 3)寻找动态链接器路径(存在动态链接) 4)根据文件头中的信息进行文件的映射,其中包括代码、数据等 5)初始化ELF文件环境 6原创 2015-04-03 23:03:31 · 742 阅读 · 0 评论 -
动态链接
由于静态链接会造成内存和磁盘空间的浪费,同时程序的更新存在问题。所以提出了动态链接的概念。具体来讲就是在程序真正运行的时候才进行链接操作,这个在一定成都上可能带来性能问题,不过这样增加了相同代码的共享,增加了内存的利用率。 动态链接的步骤: 1) 加载可执行文件(存在外部符号引用),过程与静态链接一样 2) 加载动态链接库ld.so 3) 操作系统将控制权交给动态链接器的入口地址 4原创 2015-04-06 09:16:00 · 835 阅读 · 0 评论 -
c运行库
在大多数程序员的眼中,一个程序的执行时从main函数开始的。可是实际上,事情的真相确实如此吗?其实之前的博客中已经提到在程序的main函数执行之前需要在进程堆栈中提前布置好main的参数。也就可以想见其实程序的执行不是从main函数开始,在main函数之前已经有代码在进行执行了。而这个执行的程序叫做入口函数或入口点,是运行库的一部分。 一个程序的执行的大体过程如下: 1、os创建进城后,将程序原创 2015-04-27 14:22:46 · 1023 阅读 · 0 评论