可执行文件的执行
可执行文件的类型是跟操作系统、编译器密切相关的,是有操作系统加载执行的,在不同的平台下有不同的格式,做到跨平台执行很难。而其他格式的文件如image、txt等文件,是有解析他的可执行文件(图片查看器、office软件等)来加载执行,跨平台相对容易。
那么可执行文件的格式究竟是怎么样的呢?一个可执行文件是如何加载解析执行的呢?
1:首先我要理解清楚可执行文件的格式。
COFF是有 unix System V Realease 3提出的格式文件。windows的PE格式就是基于COFF格式的。COFF格式的主要贡献是引入了段的概念。
运行如下命令:objdump -h hello.o
hello.o: 文件格式 elf32-i386 节: Idx Name Size (大小) VMA LMA File off(偏移) Algn 0 .text 0000001c 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 00000050 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000050 2**2 ALLOC 3 .rodata 0000000c 00000000 00000000 00000050 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .comment 0000002b 00000000 00000000 0000005c 2**0 CONTENTS, READONLY 5 .note.GNU-stack 00000000 00000000 00000000 00000087 2**0 CONTENTS, READONLY 6 .eh_frame 00000038 00000000 00000000 00000088 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
他包括数据段(.data)、代码段(.text)、bss
还有3个段 只读数据段(.rodata)、注释信息段(.comment)、堆栈提示段(.note.GUN-stack)。
CONTENTS,ALLOC、LOAD、 READONLY等说明了各个段的属性。其中CONTENTS说明段是否存在。
这个只是显示了hello.o中的主要的段,不是全部信息。
运行如下命令:
readelf -s hello.o 查看所有段的信息。
.data段存放的全局静态和局部静态变量。
.rodata存放的是只读数据段。
.BSS 段存放的是未初始化的全局变了和局部静态变量。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
书中有个小测试,
static int x1 =0; 存放在.bss。因为未初始化的数据都是0,所以x1放在了.bss中,是未初始化的变量。
static int x2 =1;存放中 .rodata中。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
疑问?
局部变量存放在代码段中?.text
段表图:
ELF对应的C结构定义:
链接的接口-符号
可执行文件中的调试信息。