
程序的链接装载和库
鬼灭之刃
提升自我
展开
-
目标文件--简介
1.目标文件的作用 编译器和汇编器创建了目标文件(包含由源程序生成的二进制代码和数据)。链接器将多个目标文件合并成一个可执行文件。 2.目标文件都有什么 一个目标文件包含五类信息。 头信息:关于文件的整体信息,诸如代码大小,翻译成该目标文件的源文件名称,和创建日期等。 目标代码:由编译器或汇编器产生的二进制指令和数据。原创 2017-08-28 09:49:15 · 1785 阅读 · 0 评论 -
目标文件--omf
只翻译了一部分翻译 2017-08-31 17:21:19 · 1201 阅读 · 0 评论 -
可重定位对象模块格式
可重定位对象模块格式(OMF)是主要用于在Intel 80x86微处理器上运行的软件的目标文件格式。 它最初由Intel开发,名称为对象模块格式,也可能是DOS用户最了解的.OBJ文件。 它已经被工具界面标准委员会标准化了。文件格式许多对象文件格式由一组表格组成,例如重定位表,它们存储在文件中的固定位置,如a.out格式,或者由标题指向,如ELF格式。 “区段”,代码,数据区等在这些文翻译 2017-08-30 17:40:51 · 1654 阅读 · 0 评论 -
动态链接的整个过程
1.静态链接的缺点 (1)同一个模块被多个模块链接时,那么这个模块在磁盘和内存中都有多个副本,导致很大一部分空间被浪费了。 (2)当程序的任意一个模块发生更新时,整个程序都要重新链接、发布给用户。 2.动态链接的基本思想 动态就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推迟到了运行时再进行,这就是动态链接(Dynamic Linking)的基原创 2017-08-29 20:57:37 · 12562 阅读 · 1 评论 -
重定位
为了决定段的大小、符号定义、符号引用,并指出包含那些库模块、将这些段放置在输出地址空间的什么地方,链接器会将所有的输入文件进行扫描。扫描完成后的下一步就是链接过程的核心,重定位。由于重定位过程的两个步骤,判断程序地址计算最初的非空段,和解析外部符号的引用,是依次、共同处理的,所以我们讲重定位即同时涉及这两个过程。 链接器的第一次扫描会列出各个段的位置,并收集程序中全局符号与段相关的值。一旦链接器原创 2017-08-29 11:27:50 · 3290 阅读 · 0 评论 -
符号管理
1.符号的作用 链接的接口:在链接中,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量的地址的引用。比如目标文件B要用到了目标文件A中的函数“foo”,那么我们就称目标文件A定义(Define)了函数“foo”,称目标文件B引用(Reference)了目标文件A中的函数“foo”。这两个概念也同样适用于变量。每个函数或变量都有自己独特的名字,才能避免链接过程中不同变量和函数之原创 2017-08-29 11:21:56 · 1680 阅读 · 0 评论 -
内存管理--程序的装载
1.装入方式 (1)绝对装入方式(Absolute Loading Mode) 在编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。例如,事先已知用户程序(进程)驻留在从 R 处开始的位置,则编译程序所产生的目标模块(即装入模块)便从 R 处开始向上扩展。 绝对装入程序按照装入模块中的地址, 将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与原创 2017-08-28 22:06:28 · 1741 阅读 · 0 评论 -
内存管理--堆
1.堆的简介 有栈对于面向过程的程序设计还远远不够,因为栈上的数据在函数返回的时候就会被释放掉,所以无法将数据传递至函数外部。而全局变量没有办法动态地产生,只能在编译的时候定义,有很多情况下缺乏表现力。在这种情况下,堆(Heap)是唯一的选择。 堆是一块巨大的内存空间,常常占据整个虚拟空间的绝大部分。在这片空间里,程序可以请求一块连续内存,并自由地使用,这块内存在程序主动放弃之前都会一直保持有原创 2017-08-28 18:10:22 · 1125 阅读 · 0 评论 -
内存管理--栈
1.栈的简介 在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。压栈操作使得栈增大,而弹出操作使栈减小。栈在程序运行中具有举足轻重的地位。最重要的,栈保存了一个函数调用所需要的维护信息,这常常被称为堆栈帧(Stack Frame)或活动记录(Activate Record)。堆栈帧一般包括如下几方面内容: (1)函数的返回地址和参数。 (2原创 2017-08-28 17:31:35 · 1314 阅读 · 0 评论 -
内存管理--内存的简介
1.程序内存 32位机器具有4G的程序内存,这个内存并不是指实际的物理内存,而是虚拟内存这个虚拟内存并不是实际存在的。 2.虚拟内存 我们知道一个虚拟空间由一组页映射函数将虚拟空间的各个页映射至相应的物理空间,那么创建一个虚拟空间实际上并不是创建空间而是创建映射函数所需要的相应的数据结构,在i386 的Linux下,创建虚拟地址空间实际上只是分配一个页目录(Page Directory)就可原创 2017-08-28 12:02:19 · 962 阅读 · 0 评论 -
目标文件--ELF目标文件
ELF文件 ELF目标文件格式的最前部是ELF文件头(ELF Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器型号、程序入口地址等。紧接着是ELF文件各个段。其中ELF文件中与段有关的重要结构就是段表(Section Header Table),该表描述了ELF文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限及段的其他属性。接着将详细分原创 2017-08-28 11:38:17 · 1300 阅读 · 0 评论 -
目标文件--以ELF文件为例对段简介
1.什么是段? 目标文件中的内容至少有编译后的机器指令代码、数据。没错,除了这些内容以外,目标文件中还包括了链接时所须要的一些信息,比如符号表、调试信息、字符串等。一般目标文件将这些信息按不同的属性,以“节”(Section)的形式存储,有时候也叫“段”(Segment),我们一般都称为“段”。 2.常用的段(以SimpleSection.o为例) SimpleSection程序: int原创 2017-08-28 11:06:35 · 1365 阅读 · 0 评论 -
静态链接的整个过程
1空间分配 例子: /*a.c*/ extern int shared;int main() { int a = 100; swap(&a,&shared); return 0; } /*b.c*/int shared = 1; void swap(int *a,int *b) { int temp; temp = (*a); (*a) = (*原创 2017-09-01 14:25:07 · 1382 阅读 · 0 评论