ELF文件学习 .bss

来源:互联网 发布:windows errorcode 2 编辑:程序博客网 时间:2024/06/07 18:48

参考

ELF格式与bss段

LINUX下目标文件的BSS段、数据段、代码段

ELF

ELF(Executable Linkable Format)是Linux系统下的一种可执行可链接文件的格式,是COFF格式的变种。在Linux系统中包括了可重定位文件(.o文件),可执行文件(/bin/bash文件),共享目标文件(.so)和核心转储文件(core dump)。

ELF文件头(ELF Header):位于ELF文件的头部,包含了描述整个文件的基本属性。
代码段(.text):用于存放程序代码,只读属性
数据段(.data):用于存放程序中经初始化的全局变量和静态局部变量,读写属性
bss段(.bss)(Block Started by Symbol):用于存放程序中未经初始化的全局变量和静态局部变量。在目标文件中,这个段并不占据实际空间,它仅仅只是一个占位符。

实验

// test1.cint a = 1;static int b = 4;int c;static int d;char *s1 = "1234";int main(){    int e = 2;    char *s2 = "3456";    return 0;}

编译文件

gcc test1.c -o test1.o

查看编译后文件的信息

objdump -sx test1.o

摘取相关信息如下:

Sections:Idx Name          Size      VMA               LMA               File off  Algn 14 .rodata       0000000e  0000000000400550  0000000000400550  00000550  2**2                  CONTENTS, ALLOC, LOAD, READONLY, DATA 23 .data         00000020  00000000006008a8  00000000006008a8  000008a8  2**3                  CONTENTS, ALLOC, LOAD, DATA 24 .bss          00000010  00000000006008c8  00000000006008c8  000008c8  2**2                  ALLOC

Sections展示了不同的段的大小。

SYMBOL TABLE:00000000006008bc l     O .data  0000000000000004              b00000000006008cc l     O .bss   0000000000000004              d00000000006008c0 g     O .data  0000000000000008              s100000000006008d0 g     O .bss   0000000000000004              c00000000006008b8 g     O .data  0000000000000004              a

SYMBOL TABLE展示了不同的变量是存在哪的。这里就可以看到
data段有:

  • 初始化了的全局变量a
  • 初始化了的静态变量b
  • 常量字符串s1

而bss段有:

  • 未初始化的全局变量c
  • 未初始化的静态变量d
    
Contents of section .rodata: 400550 01000200 31323334 00333435 3600      ....1234.3456. Contents of section .data: 6008a8 00000000 00000000 00000000 00000000  ................ 6008b8 01000000 04000000 54054000 00000000  ........T.@.....

可以看到rodata段中有我们定义的1234和3456
而data段里有1和4(小端)分别对应a和b

还可以读取elf文件,命令是readelf

0 0