ELF格式文件由哪些段组成?
创始人
2024-06-02 20:29:50
0

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

参考内容

(1)ELF文件格式解析_elf文件解析_mergerly的博客-CSDN博客

(2)Linux C/C++目标文件、可执行文件分为几段? - 知乎(推荐其博客)

(3)程序的编译、装载与链接

一、ELF格式简介

Linux系统下,C/C++源码进行汇编之后生成的.o目标文件,或者链接之后生成的可执行程序文件,它们一般是ELF文件格式(Executable and Linking Format,可执行与可连接格式)。

Linux上的目标文件(Relocatable File)、可执行文件(Executable File)、动态链接库文件(Shared Object File)、coredump文件(Core Dump File)都是ELF格式。

这类文件是分段进行组织的,段的个数可通过代码控制,但通常一个程序文件中至少包含以下段:

  • text段:代码段,存储编译后的二进制机器码。注意(非静态的)局部变量也放在这个段。
  • data段:数据段,存放初始化后的全局变量、初始化后的局部静态变量。
  • bss段:存储未初始化的全剧变量和局部静态变量(默认值为0)。

本文介绍的是ELF文件的格式,不是介绍程序进程的地址空间分布。不过两者有一定的关系,将来ELF文件被执行时,它所对应的进程地址空间分布中每个区域的内容,就对应着该文件的段内容?

二、举例说明

本文以一个简单的C程序为例,说明C/C++代码跟ELF文件中的段是如何对应的。

//main.c
#include long global_n1; // 全局变量默认初始化为0,指针的话就是null
long global_n2 = 10; long sum_func(long a, long b)  
{static long local_static_n1; // 局部静态变量默认初始化为0static long local_static_n2 = 123;static long local_static_n3 = 456;return a + b;
}int main(void)
{long sum = sum_func(global_n1, global_n2);printf("sum=%ld\n", sum);return 0;
}

为了简化分析,我们将上述代码编译为目标文件而不是可执行文件,因为编译为可执行文件时,会引入很多另外的符号和段。 

gcc -c -o main.o main.c

然后使用objdump工具查看main.o这个目标文件的反汇编代码,-t选项表示显示符号列表。

xjh@ubuntu:~/iot/tmp$ objdump -t main.omain.o:     文件格式 elf32-i386SYMBOL TABLE:
00000000 l    df *ABS*	00000000 main.c
00000000 l    d  .text	00000000 .text
00000000 l    d  .data	00000000 .data
00000000 l    d  .bss	00000000 .bss
00000000 l    d  .rodata	00000000 .rodata
00000004 l     O .data	00000004 local_static_n3.1831
00000008 l     O .data	00000004 local_static_n2.1830
00000000 l     O .bss	00000004 local_static_n1.1829
00000000 l    d  .note.GNU-stack	00000000 .note.GNU-stack
00000000 l    d  .eh_frame	00000000 .eh_frame
00000000 l    d  .comment	00000000 .comment
00000004       O *COM*	00000004 global_n1
00000000 g     O .data	00000004 global_n2
00000000 g     F .text	0000000d sum_func
0000000d g     F .text	0000003f main
00000000         *UND*	00000000 printfxjh@ubuntu:~/iot/tmp$ 

从中可以知道每个符号(函数名、变量名)位于哪个段:

符号备注
.datalocal_static_n3
local_static_n2
global_n2

存放初始化的全局变量、初始化的局部静态变量。

.bsslocal_static_n1
global_n1
存放未初始化的全局变量、未初始化的局部静态变量。
.textsum_func
main
存放代码

通过size命令可以查看每个段的大小。如下所示,text段的大小173字节(main函数和sum_func函数的二进制代码长度),data段的大小是12字节(上表中的.data段的3个变量的大小),bss段的大小是4字节(上表中.bss段的两个变量的大小)。

xjh@ubuntu:~/iot/tmp$ size main.otext	   data	    bss	    dec	    hex	filename173	     12	      4	    189	     bd	main.o
xjh@ubuntu:~/iot/tmp$

上面说到将程序编译为可执行文件时,会引入很多另外的符号和段。 现在我们来验证一下。

xjh@ubuntu:~/iot/tmp$ gcc main.o -o main.elf
xjh@ubuntu:~/iot/tmp$ objdump -t main.elf main.elf:     文件格式 elf32-i386SYMBOL TABLE:
08048154 l    d  .interp	00000000              .interp
08048168 l    d  .note.ABI-tag	00000000              .note.ABI-tag
08048188 l    d  .note.gnu.build-id	00000000              .note.gnu.build-id
080481ac l    d  .gnu.hash	00000000              .gnu.hash
080481cc l    d  .dynsym	00000000              .dynsym
0804821c l    d  .dynstr	00000000              .dynstr
08048268 l    d  .gnu.version	00000000              .gnu.version
08048274 l    d  .gnu.version_r	00000000              .gnu.version_r
08048294 l    d  .rel.dyn	00000000              .rel.dyn
0804829c l    d  .rel.plt	00000000              .rel.plt
080482b4 l    d  .init	00000000              .init
080482e0 l    d  .plt	00000000              .plt
08048320 l    d  .text	00000000              .text
080484e4 l    d  .fini	00000000              .fini
080484f8 l    d  .rodata	00000000              .rodata
0804850c l    d  .eh_frame_hdr	00000000              .eh_frame_hdr
08048540 l    d  .eh_frame	00000000              .eh_frame
08049f08 l    d  .init_array	00000000              .init_array
08049f0c l    d  .fini_array	00000000              .fini_array
08049f10 l    d  .jcr	00000000              .jcr
08049f14 l    d  .dynamic	00000000              .dynamic
08049ffc l    d  .got	00000000              .got
0804a000 l    d  .got.plt	00000000              .got.plt
0804a018 l    d  .data	00000000              .data
0804a02c l    d  .bss	00000000              .bss
00000000 l    d  .comment	00000000              .comment
00000000 l    df *ABS*	00000000              crtstuff.c
08049f10 l     O .jcr	00000000              __JCR_LIST__
08048360 l     F .text	00000000              deregister_tm_clones
08048390 l     F .text	00000000              register_tm_clones
080483d0 l     F .text	00000000              __do_global_dtors_aux
0804a02c l     O .bss	00000001              completed.6600
08049f0c l     O .fini_array	00000000              __do_global_dtors_aux_fini_array_entry
080483f0 l     F .text	00000000              frame_dummy
08049f08 l     O .init_array	00000000              __frame_dummy_init_array_entry
00000000 l    df *ABS*	00000000              main.c
0804a024 l     O .data	00000004              local_static_n3.1831
0804a028 l     O .data	00000004              local_static_n2.1830
0804a030 l     O .bss	00000004              local_static_n1.1829
00000000 l    df *ABS*	00000000              crtstuff.c
0804860c l     O .eh_frame	00000000              __FRAME_END__
08049f10 l     O .jcr	00000000              __JCR_END__
00000000 l    df *ABS*	00000000              
08049f0c l       .init_array	00000000              __init_array_end
08049f14 l     O .dynamic	00000000              _DYNAMIC
08049f08 l       .init_array	00000000              __init_array_start
0804a000 l     O .got.plt	00000000              _GLOBAL_OFFSET_TABLE_
080484e0 g     F .text	00000002              __libc_csu_fini
0804a020 g     O .data	00000004              global_n2
00000000  w      *UND*	00000000              _ITM_deregisterTMCloneTable
08048350 g     F .text	00000004              .hidden __x86.get_pc_thunk.bx
0804a018  w      .data	00000000              data_start
00000000       F *UND*	00000000              printf@@GLIBC_2.0
0804a02c g       .data	00000000              _edata
080484e4 g     F .fini	00000000              _fini
0804a018 g       .data	00000000              __data_start
00000000  w      *UND*	00000000              __gmon_start__
0804a01c g     O .data	00000000              .hidden __dso_handle
080484fc g     O .rodata	00000004              _IO_stdin_used
00000000       F *UND*	00000000              __libc_start_main@@GLIBC_2.0
0804a034 g     O .bss	00000004              global_n1
08048470 g     F .text	00000061              __libc_csu_init
0804a038 g       .bss	00000000              _end
08048320 g     F .text	00000000              _start
080484f8 g     O .rodata	00000004              _fp_hw
0804a02c g       .bss	00000000              __bss_start
0804842a g     F .text	0000003f              main
00000000  w      *UND*	00000000              _Jv_RegisterClasses
0804a02c g     O .data	00000000              .hidden __TMC_END__
00000000  w      *UND*	00000000              _ITM_registerTMCloneTable
0804841d g     F .text	0000000d              sum_func
080482b4 g     F .init	00000000              _initxjh@ubuntu:~/iot/tmp$ 

相关内容

热门资讯

此次新版龙之谷怎么去查看自己的... 此次新版龙之谷怎么去查看自己的VIP等级?此次新版龙之谷怎么去查看自己的VIP等级?点击VIP按钮问...
吴京爆出易烊千玺伤情,恢复情况... 吴京爆出易烊千玺伤情,恢复情况让人担忧,易烊千玺该何去何从?也没有多严重啊,易烊千玺后面自己的还有几...
奥比岛时空穿梭机的答案是多少 奥比岛时空穿梭机的答案是多少我很想要礼物!!如果有谁知道,就告诉我吧1.黄金海岸:点精灵打章鱼的牌子...
谁帮我学一篇关于大学校园生活的... 谁帮我学一篇关于大学校园生活的英语作文,谢谢了哦这是我们老师给我们的作业,我不会写,帮帮忙你自己好好...
世界是否在本质上是数学的 世界是否在本质上是数学的即数学是否是分析和理解这个世界的真正途径;还是数学仅仅适用于事物的表面和数量...
鲁智深 倒拔垂杨柳表面上的原因... 鲁智深 倒拔垂杨柳表面上的原因 目的是什么表面原因:大树上的乌鸦喳喳叫个不停,吵得人心烦。泼皮们嫌不...
洛阳历史上的大事件 洛阳历史上的大事件董卓火烧洛阳城!
末伏是什么节日,又是什么意思 末伏是什么节日,又是什么意思一年中最热的时间称三伏天,末伏是三伏中的第三伏就是三伏天的最后一个阶段
倚天开篇的何足道武功高强,为什... 倚天开篇的何足道武功高强,为什么在书中却销声匿迹了?其实并未销声匿迹,反而光大了昆仑派,助昆仑派成为...
如何处理日常工作和临时性任务之... 如何处理日常工作和临时性任务之间的关系临时性任务多半是重要的突发性任务,优先处理如果是不怎么重要的临...
陈情令:魏无羡当年求死坠落悬崖... 陈情令:魏无羡当年求死坠落悬崖,为何复活后没了这种想法?我觉得主要是因为找到了知音蓝忘机,知道这个世...
有谁知道这部电影叫什么名字?是... 有谁知道这部电影叫什么名字?是部国外电影。讲述的是一个女人如果赶上火车跟没有赶上是两种不同的命运。知...
孩子现在二年级,想报跟谁学张镇... 孩子现在二年级,想报跟谁学张镇老师的课,又不知道能不能学?有报过的吗?表示不认识,可以啊真的张镇老师...
《十段生命的律动》完整版在线播... 《十段生命的律动》完整版在线播放
斯文书卷气是什么意思呢? 斯文书卷气是什么意思呢?不是的.是说你很有书生的味道.好好先生.缺乏男人的阳钢之美,太细腻了或许已经...
电子手表怎么换电子,学生表 电子手表怎么换电子,学生表去找一个修手表的地方买一个电池,可以自己用螺丝刀扭开后盖,如果不放心可以让...
汽车后退时踩刹车出现响声? 汽车后退时踩刹车出现响声?刹车片和刹车盘摩擦的声音如果不严重可以不处理。
君高声自远,非是藉秋风 君高声自远,非是藉秋风有没有关于”君高声自远,非是藉秋风”的文章啊?你桐棚需要什么,说清楚点。原诗“...
现在高三了,到每次考试英语听力... 现在高三了,到每次考试英语听力都失分很多,应该怎么样提高英语听力能力?多数是不认真,你能听好的多看英...
后期做好的歌曲怎么替换上传到唱... 后期做好的歌曲怎么替换上传到唱吧?好像是添加到那个录音对应的本地文件夹