`

链接、装载、库读书笔记(一)

 
阅读更多

可执行文件的执行

 

可执行文件的类型是跟操作系统、编译器密切相关的,是有操作系统加载执行的,在不同的平台下有不同的格式,做到跨平台执行很难。而其他格式的文件如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结构定义:

 

链接的接口-符号

 

可执行文件中的调试信息。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics