{目标管理}目标文件及链接

上传人:精****库 文档编号:140718282 上传时间:2020-07-31 格式:PPTX 页数:34 大小:206.97KB
返回 下载 相关 举报
{目标管理}目标文件及链接_第1页
第1页 / 共34页
{目标管理}目标文件及链接_第2页
第2页 / 共34页
{目标管理}目标文件及链接_第3页
第3页 / 共34页
{目标管理}目标文件及链接_第4页
第4页 / 共34页
{目标管理}目标文件及链接_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《{目标管理}目标文件及链接》由会员分享,可在线阅读,更多相关《{目标管理}目标文件及链接(34页珍藏版)》请在金锄头文库上搜索。

1、目标文件及链接,1,C/C+源文件,cc1/g+,头文件,汇编文件,as,目标文件,生成库,连接命令文件,可重定位模块,ld,ar,用户库,库列表,可执行程序,2,3,目标文件是什么样的 ?,目标文件中的内容至少有编译后的机器指令代码、数据。没错,除了这些内容以 外,目标文件中还包括了链接时所须要的一些信息,比如符号表、调试信息、字符串 等。,4,目标文件的格式(ABI) ?,符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性 相关的内容称为ABI(Application Binary Interface)。我们常见的ABI格式:,A.out,PE,ELF,一般目标文件将这

2、些信息按不同的属性,以“节”(Section)的形式存储,有时候也叫“段”(Segment)。,5,struct exec unsigned long a_midmag; unsigned long a_text; unsigned long a_data; unsigned long a_bss; unsigned long a_syms; unsigned long a_entry; unsigned long a_trsize; unsigned long a_drsize; ;,a.out是早期unix系统使用的可执行文件格式,由AT int global_uninit_var; vo

3、id func1( int i ) printf( %dn, i ); int main(void) static int static_var = 85; static int static_var2; int a = 1; int b; func1( static_var + static_var2 + a + b ); return a; ,SimpleSection.c,10,SimpleSection.o各段信息,$ objdump -h SimpleSection.o SimpleSection.o: file format elf32-i386 Sections: Idx Nam

4、e Size VMA LMA File off Algn 0 .text 0000005b 00000000 00000000 00000034 2*2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000008 00000000 00000000 00000090 2*2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000004 00000000 00000000 00000098 2*2 ALLOC 3 .rodata 00000004 00000000 00000000 00000098 2*0

5、 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .comment 0000002a 00000000 00000000 0000009c 2*0 CONTENTS, READONLY 5 .note.GNU-stack 00000000 00000000 00000000 000000c6 2*0 CONTENTS, READONLY,11,$ objdump -s -d SimpleSection.o 00000000 : 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 08 sub $0 x8,%esp 6:

6、 8b 45 08 mov 0 x8(%ebp),%eax 9: 89 44 24 04 mov %eax,0 x4(%esp) d: c7 04 24 00 00 00 00 movl $0 x0,(%esp) 14: e8 fc ff ff ff call 15 19: c9 leave 1a: c3 ret 0000001b : 1b: 8d 4c 24 04 lea 0 x4(%esp),%ecx 1f: 83 e4 f0 and $0 xfffffff0,%esp 22: ff 71 fc pushl -0 x4(%ecx) 25: 55 push %ebp 26: 89 e5 mo

7、v %esp,%ebp 28: 51 push %ecx 29: 83 ec 14 sub $0 x14,%esp 2c: c7 45 f4 01 00 00 00 movl $0 x1,-0 xc(%ebp) 33: 8b 15 04 00 00 00 mov 0 x4,%edx 39: a1 00 00 00 00 mov 0 x0,%eax 3e: 8d 04 02 lea (%edx,%eax,1),%eax 41: 03 45 f4 add -0 xc(%ebp),%eax 44: 03 45 f8 add -0 x8(%ebp),%eax 47: 89 04 24 mov %eax

8、,(%esp) 4a: e8 fc ff ff ff call 4b 4f: 8b 45 f4 mov -0 xc(%ebp),%eax 52: 83 c4 14 add $0 x14,%esp 55: 59 pop %ecx 56: 5d pop %ebp 57: 8d 61 fc lea -0 x4(%ecx),%esp 5a: c3 ret,SimpleSection.o反汇编代码,12,ELF文件结构描述,13,ELF文件头,typedef struct unsigned char e_ident16; Elf32_Half e_type;/ Elf32_Half e_machine;

9、 Elf32_Word e_version; Elf32_Addr e_entry;/ Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; Elf32_Ehdr;,描述了字的大小 产生此文件的系统的字节次序 目标文件的类型 机器类型 节头表的位置 其它,14,段头表,段头

10、表 目标文件中各节的位置和大小 处于目标文件的末尾,15,text节 被编译程序的机器代码 rodata节 诸如printf语句中的格式串和switch语句的跳转表等只读数据 data节 已初始化的全局变量 bss节(.comm 节) 未初始化的全局变量 在目标文件中不占实际的空间,16,typedef struct Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link

11、; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; Elf32_Shdr;,段描述符(Section header Descriptor),每个段描述符都对应一个段,17,SimpleSection.o段表信息,$ readelf -S SimpleSection.o There are 11 section headers, starting at offset 0 x118: Section Headers: Nr NameType Addr Off Size ES Flg Lk Inf Al 0 NU

12、LL 00000000 000000 000000 00 0 0 0 1 .text PROGBITS 00000000 000034 00005b 00 AX 0 0 4 2 .rel.textREL 00000000 000428 000028 089 1 4 3 .dataPROGBITS 00000000 000090 000008 00 WA 0 0 4 4 .bss NOBITS 00000000 000098 000004 00 WA 0 0 4 5 .rodataPROGBITS 00000000 000098 000004 00 A 0 0 1 6 .commentPROGB

13、ITS 00000000 00009c 00002a 00 0 0 1 7 .note.GNU-stackPROGBITS 00000000 0000c6 000000 00 0 0 1 8 .shstrtab STRTAB 00000000 0000c6 000051 00 0 0 1 9 .symtab SYMTAB 00000000 0002d0 0000f0 10 10 10 4 10 .strtab STRTAB 00000000 0003c0 000066 00 0 0 1,18,SimpleSection.o的段表及所有段的位置和长度,19,符号表 Elf32_Addr st_v

14、alue; Elf32_Word st_size; unsigned char st_info; unsigned char st_other; Elf32_Half st_shndx; Elf32_Sym;,20,模块之间组装,一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两 个步骤。从程序员的角度来看,引入这两个步骤带来的好处就是可以 直接在程序中使用printf和errno这种有意义的函数名和变量名,而 不用明确指明printf和errno在标准C库中的地址。当然,为了将程序 员从早期直接使用地址编程的梦魇中解救出来,编译器和汇编器在这 当中做出了革命性的贡献。编译器和汇编器

15、的出现使得程序员可以在 程序中使用更具意义的符号来为函数和变量命名,这样使得程序在正 确性和可读性等方面都得到了极大的提高。但是随着C语言这种支持 分别编译的程序设计语言的流行,一个完整的程序往往被分割为若干 个独立的部分并行开发,而各个模块间通过函数接口或全局变量进行 通讯。这就带来了一个问题,编译器只能在一个模块内部完成符号名 到地址的转换工作,不同模块间的符号解析由谁来做呢?,21,链接是一个收集、组织程序所需的不同代码 和数据的过程,以便程序能被装入内存并被执行。 链接过程分为两步: -空间与地址分配 扫描所有的输入目标文件,获得它们的各个段的长度、属性和位置,并且将输入目标文件中的符

16、号定义和符号引用收集起来,统一放到一个全局符号表。这一步中,链接器将能获得所有输入目标文件的段长度,并且将它们合并,计算出输出文件中各个段合并后的长度与位置,并建立映射关系。 -符号解析与重定位 使用上面第一步中收集到的所有信息,读取输入文件中段的数据、重定位信息,并且进行符号解析与重定位、调整代码中的地址等。事实上第二步是链接过程的核心,特别是重定位过程。,链接,22,/*a.c*/ extern int shared; int main() int a = 100; swap( ,/*b.c*/ int shared = 1; void swap(int *a, int *b) *a = *b = *a = *b; ,看一个链接的例子,23,链接前后各个段的属性,$objdump h a.o sections: Idx NameSize VMA LMA File off Algn 0 .text00000034 00000000 00000000 00000034 2*2 CONTENTS,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号