
程序员的自我修养
文章平均质量分 93
乌鸦_在飞
这个作者很懒,什么都没留下…
展开
-
解析目标文件
1.目标文件是什么 编译阶段分为预处理,编译,汇编,链接。Linux下汇编之后生成的.o文件就是目标文件,此时的目标文件经过链接之后才会生成最后的可执行文件。实际上,目标文件和可执行文件的结构基本上是相同的,区别就是目标文件中对一些符号的引用和地址还没有确定,只有等到链接之后才能确定。可以把目标文件和可执行文件看成是同一类型的文件。 2.目标文件的格式 Windows下可执行文件的格式是PE...原创 2018-11-08 15:55:46 · 506 阅读 · 0 评论 -
静态链接
链接就是指将多个目标文件链接在一起并最终形成一个可执行文件。 两个示例源码: a.c extern int shared; int main() { int a=100; swap(&a,&shared); } b.c int shared=1; void swap(int *a,int *b) { int c; c=*a; *a=*b; *b=...原创 2018-11-15 20:39:05 · 2868 阅读 · 0 评论 -
Windows PE/COFF
1.Windows的二进制文件格式PE/COFF 在32位Windows平台下,微软引入了一种叫PE(Protable Executable)的可执行格式。PE文件格式和ELF都是由COFF格式发展而来的。而对于VISUALC++编译器产生的目标文件仍然使用COFF格式。由于PE是COFF的一种扩展,所以它们的结构在很大程度上相同,甚至跟ELF文件的基本结构也相同。即Windows下目标文件默认...原创 2018-11-20 21:14:55 · 873 阅读 · 0 评论 -
可执行文件的装载与进程
1. 进程虚拟地址空间 每个进程拥有自己独立的虚拟地址空间,这个虚拟地址空间由cpu位数决定,硬件决定了地址空间的最大理论上限,即硬件的寻址空间大小。比如32位的硬件平台决定了虚拟地址空间的地址为0到2^32-1,即0x00000000~0xFFFFFFFF,共4GB。而64位的硬件平台具有64位寻址能力,虚拟地址空间达到2^64字节,即17179869184GB。 从程序角度,比如可以判断C...原创 2018-11-29 10:43:29 · 470 阅读 · 0 评论 -
动态链接(一)
1. 为什么要动态链接 静态链接的缺点: (1)内存和磁盘空间: 比如有两个程序,目标文件分别为Program1.o,Program2.o,并且都用到Lib.o这个模块。静态链接生成可执行文件Program1,Program2时,它们都分别存有Lib.o模块的一个副本。当同时运行Program1和Program2时,Lib.o在磁盘和内存中都有两个副本。可见会造成内存和磁盘空间的浪费。 (...原创 2018-12-04 12:13:46 · 604 阅读 · 0 评论 -
动态链接(二)
5. 动态链接相关结构 首先装载方面和静态链接下的装载基本无异,唯一不同的是装载完之后控制权交给动态链接器,而不是可执行文件的入口。系统加载完动态链接器之后将控制权交给动态链接器的入口地址,接着动态链接器进行一系列的初始化及链接工作,完成之后将控制权交给可执行文件的入口,开始执行。 5.1 .interp段 在动态链接的ELF可执行文件中,存在.interp段,专门说明需要用到的动态链接器的...原创 2018-12-05 15:04:02 · 537 阅读 · 0 评论