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$ 

相关内容

热门资讯

模式口是个好地方   “五一”假期,“华彩模式”二〇二五模式口国潮文化节启幕,吸引不少市民游客来到驼铃古道感受国潮风。...
中国科技出版传媒股份有限公司关... 证券代码:601858 证券简称:中国科传 公告编号:2025-026中国科技出版传媒股份有限公司...
中重科技(天津)股份有限公司关... 证券代码:603135 证券简称:中重科技 公告编号:2025-030中重科技(天津)股份有限公司...
西宁城东多条特色街区焕新 本报讯(西海新闻记者 周建萍)“东西两侧加装的木雕牌坊和一顶顶白色的凉棚看着真清爽,改造后的下南关街...
金隅琉璃文创园成微度假胜地   本报讯(记者 潘福达)“五一”假期,位于永定河畔、西山脚下的门头沟区琉璃渠村成为热门打卡地,不少...
阿曼宣布美国与胡塞武装达成停火... 新华社多哈5月6日电,马斯喀特消息:阿曼外交大臣巴德尔6日在社交媒体上发文说,根据阿曼与美方及也门萨...
内蒙古推动高速公路服务区 7项... 转自:内蒙古日报本报5月6日讯  (记者  高慧)记者从内蒙古自治区交通运输厅获悉:该厅近日印发《内...
新疆汇嘉时代百货股份有限公司关... 证券代码:603101 证券简称:汇嘉时代 公告编号:2025-020新疆汇嘉时代百货股份有限公司...
“瓷娃娃”逆袭!创电商公司年营...   “我是成骨不全症患者,大家都叫我‘瓷娃娃’就好。”4月29日,肖波正带着自创的企业参加一场博览会...
福建天马科技集团股份有限公司关... 证券代码:603668 证券简称:天马科技 公告编号:2025-031福建天马科技集团股份有限公司...
呼和浩特市给出高质量就业“新解... 转自:内蒙古日报□本报记者  郑学良  通讯员  赵宇昕  就业,一头连着经济发展,一头系着万家冷暖...
呼和浩特市2家乳企入选 首批中... 转自:内蒙古日报本报5月6日讯  (记者 康丽娜)记者从呼和浩特市工信局获悉:工信部于日前公布首批中...
山东宏创铝业控股股份有限公司关... 股票代码:002379 股票简称:宏创控股 公告编号:2025-023山东宏创铝业控股股份有限公司...
新奥运周期国羽初试过关 为期8天的2025年苏迪曼杯世界羽毛球混合团体锦标赛,于5月4日晚在福建厦门落幕。决赛中,在超过一万...
赛力斯集团股份有限公司2024... 证券代码:601127 证券简称:赛力斯 公告编号:2025-056赛力斯集团股份有限公司2024年...
特朗普宣布停止轰炸胡塞武装并称...   美国总统唐纳德·特朗普表示,将自即日起停止对也门胡塞武装的轰炸行动,理由是该组织“已投降”。不过...
福建省青山纸业股份有限公司关于... 证券代码:600103证券简称:青山纸业 公告编号:临 2025-021福建省青山纸业股份有限公司...
国际油价周二上涨逾3% 受欧洲...   周二,国际油价涨幅超过3%,主要受欧洲和中国需求上升信号、中东紧张局势升级以及OPEC+增产决议...
厦门瑞尔特卫浴科技股份有限公司... 证券代码:002790证券简称:瑞尔特 公告编号:2025-024厦门瑞尔特卫浴科技股份有限公司关于...
一季度满洲里海关签发 原产地证... 转自:内蒙古日报本报5月6日讯  (记者  阿妮尔)记者从满洲里海关获悉:今年一季度,满洲里海关累计...