目标文件中的几个重要的段
今年来学习一下目标文件。那啥是目标文件呢?简单的说:目标文件就是经过编译和汇编,但没有经过没了链接的文件。看一段测试代码:
#include <stdio.h>int a = 84;//已初始化的全局变量
int b;//未初始化的全局变量void func(int i)
{printf("%d\n",i);
}int main()
{static int c = 85;//已初始化的局部静态变量static int d;//未初始化的局部静态变量int e = 1;//已初始化的局部变量int f;//未初始化局部变量func(c+d+e+f);return e;
}
笔者linux下该文件名为test.c,则直接执行gcc -c test.c 命令,生成test.o文件。再看:
[mapan@localhost mapam]$ objdump -h test.o test.o: file format elf64-x86-64Sections:
Idx Name Size VMA LMA File off Algn0 .text 00000054 0000000000000000 0000000000000000 00000040 2**2CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE1 .data 00000008 0000000000000000 0000000000000000 00000094 2**2CONTENTS, ALLOC, LOAD, DATA2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2ALLOC3 .rodata 00000004 0000000000000000 0000000000000000 0000009c 2**0CONTENTS, ALLOC, LOAD, READONLY, DATA4 .comment 0000002e 0000000000000000 0000000000000000 000000a0 2**0CONTENTS, READONLY5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 000000ce 2**0CONTENTS, READONLY6 .eh_frame 00000058 0000000000000000 0000000000000000 000000d0 2**3CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
objdump -h 把ELF文件的各个段的基本信息打印出来。
竖着看:
.text为代码段,存放程序源代码编译后的机器指令。
.data为数据段,存放已初始化的全局变量和局部静态变量
.bss为数据段, 存放未初始化的全局变量和局部静态变量
.rodata为只读数据段
.conment为注释信息段
.note.GUN-stack为堆栈段
.eh_frame为调试信息段
横着看:
size为段的长度
File off 为段所在的位置
为了详细了解每个段的内容,我们需要查看反汇编。
[mapan@localhost mapam]$ objdump -s -d test.o test.o: file format elf64-x86-64Contents of section .text:0000 554889e5 4883ec10 897dfcb8 00000000 UH..H....}......0010 8b55fc89 d64889c7 b8000000 00e80000 .U...H..........0020 0000c9c3 554889e5 4883ec10 c745f801 ....UH..H....E..0030 0000008b 15000000 008b0500 0000008d ................0040 04020345 f80345fc 89c7e800 0000008b ...E..E.........0050 45f8c9c3 E...
Contents of section .data:0000 54000000 55000000 T...U...
Contents of section .rodata:0000 25640a00 %d..
Contents of section .comment:0000 00474343 3a202847 4e552920 342e342e .GCC: (GNU) 4.4.0010 37203230 31323033 31332028 52656420 7 20120313 (Red 0020 48617420 342e342e 372d3138 2900 Hat 4.4.7-18).
Contents of section .eh_frame:0000 14000000 00000000 017a5200 01781001 .........zR..x..0010 1b0c0708 90010000 1c000000 1c000000 ................0020 00000000 24000000 00410e10 8602430d ....$....A....C.0030 065f0c07 08000000 1c000000 3c000000 ._..........<...0040 00000000 30000000 00410e10 8602430d ....0....A....C.0050 066b0c07 08000000 .k...... Disassembly of section .text:0000000000000000 <func>:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: 48 83 ec 10 sub $0x10,%rsp8: 89 7d fc mov %edi,-0x4(%rbp)b: b8 00 00 00 00 mov $0x0,%eax10: 8b 55 fc mov -0x4(%rbp),%edx13: 89 d6 mov %edx,%esi15: 48 89 c7 mov %rax,%rdi18: b8 00 00 00 00 mov $0x0,%eax1d: e8 00 00 00 00 callq 22 <func+0x22>22: c9 leaveq 23: c3 retq 0000000000000024 <main>:24: 55 push %rbp25: 48 89 e5 mov %rsp,%rbp28: 48 83 ec 10 sub $0x10,%rsp2c: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%rbp)33: 8b 15 00 00 00 00 mov 0x0(%rip),%edx # 39 <main+0x15>39: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 3f <main+0x1b>3f: 8d 04 02 lea (%rdx,%rax,1),%eax42: 03 45 f8 add -0x8(%rbp),%eax45: 03 45 fc add -0x4(%rbp),%eax48: 89 c7 mov %eax,%edi4a: e8 00 00 00 00 callq 4f <main+0x2b>4f: 8b 45 f8 mov -0x8(%rbp),%eax52: c9 leaveq 53: c3 retq
objdump的-s参数可以将所有段的内容可以将所有段的内容以十六进制的方式打印出来,-d参数可以将指令的段反汇编。
对于Contents of section .text:最左面一列是偏移量,中间4列是十六进制内容,最右面一列是.text段的ASCII码形式。它是对.text的说明。
对于Contents of section .data:里面有2个值,54000000和55000000他们分别是示例代码中变量a和变量c。
对于.bss:
2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2
它的大小是4,它存放代码示例中变量d,而变量b没有存放在.bss段,这是根编译器的实现有关。这里的变量b存放在.comment段,但是编译单元内部可见的静态变量是存放在.bss段的。
参考资料:程序员的自我修养
目标文件中的几个重要的段相关推荐
- c语言目标文件作用,关于编译:C语言中的目标文件是什么?
我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释. 其他任何编译文件和目标文件之间的真正区别是什么? 如果有人能够用人类语言进行解释,我将感到非常高兴. 一个更活跃的版本:stac ...
- 程序员的自我修养--链接、装载与库笔记:目标文件里有什么
编译器编译源代码后生成的文件叫做目标文件.目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整.其实它本身就是按照可执行文件格式存储的, ...
- 程序员的自我修养三目标文件里有什么
编译器编译源代码后生成的文件叫做目标文件. 目标文件从结构上讲,它是已经编译后的可执行文件格式,只是没有经过链接的过程. 3.1目标文件的格式 现在PC平台流行的是可执行文件格式,主要是win下的PE ...
- 目标文件(.o)结构的简单了解
文章目录 SimpleSection.o 的结构 代码段 .text 数据段 .data和只读数据段 .rodata .bss段 其他段 今天来了解一下在编译过程中所产生的的目标文件的具体结构.(Ub ...
- STM32F103 IAP升级时在app文件中放置标志字节处的地址计算
为了防止升级时选错文件,在APP程序中某个位置放置4个标志字节55 AA 55 AA,在生成的二进制文件目标中对应的位置要按照以下公式计算: 二进制目标文件中标志字节的位置 = FLASH中的位置-F ...
- Linux awk+uniq+sort 统计文件中某字符串出现次数并排序
在服务器开发中,我们经常会写入大量的日志文件.有时候我们需要对这些日志文件进行统计.Linux中我们可以利用以下命令简单高效的实现这一功能. 需要用到的命令简介 cat命令 cat命令主要有三大功能 ...
- 目标文件里面到底有什么(2)?
真正了不起的程序员对自己的程序的每一个字节都了如指掌! 前面对于目标文件只是做了概念上的阐述,如果不彻底深入目标文件的具体细节,这样的分析就是泛泛而谈没有意义,也没有深入的理解.就象知道TCP/IP协 ...
- 目标文件里面到底有什么(1)?
目标文件是指:编译器编译源代码后生成的文件,那么目标文件里面到底存放的是什么呢?或者说我们的源代码在经过编译以后是怎么样存储的呢? 目标文件从结构上将,它是已经编译后的可执行文件格式,只是好没有经过链 ...
- build文件_把编译时间加入到目标文件
出处:https://www.cnblogs.com/pingwen/p/8183728.html 1.问题背景:如何保证发布出去的bin文件是最终测试通过的版本? 一般的来讲,代码到了测试后期,ma ...
最新文章
- 时间序列入门教程,从理论到业务实践,Kaggle kernels Master 整理分享
- centos linux分区,人文网-Linux CentOS 系统分区方法
- html缩进快捷键_Mac技巧|如何高效使用苹果便笺?利用便笺快捷键快速完成操作!
- linux c 创建子进程 执行任务
- mysql相同姓名只显示第一条_SQL中遇到多条相同内容只取一条的最简单实现方法...
- java isodate格式_fmt:formatDate的输出格式详解
- C++找到一个大于或等于n且为2的幂的数字p的算法实现(附完整源码)
- python 正则re模块
- JAVA进制及进制之间的转换
- [css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子
- OraOLEDbpus.dll找不到指定的模块的解决办法
- thymeleaf 中select下拉回显
- 迭代式客户端-服务系模型
- Maven插件介绍:spring-boot-maven-plugin
- bl系列刀片(blade)服务器,HPE Integrity BL870c i6 刀片服务器
- 计算机自动化考试试题,计算机等级考试,办公自动化考试试题(一).doc
- 总结AUTOCAD快捷键,持续更新~
- 服务器端口怎么调出虚拟键盘,win10系统打开软键盘 win10怎么调出软键盘
- python进程间通信时间开销_python 进程间的通信
- python tensorflow教程_真正从零开始,TensorFlow详细安装入门图文教程!
热门文章
- Python语言的程序结构
- 【《Objective-C基础教程 》笔记】(八)OC的基本事实和OC杂七杂八的疑问
- zabbix3.2.1安装graphtrees插件
- 小技巧textbox的行数
- 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...
- GitHub Top 100 Objective-C 项目简介
- this.parentNode.nextSibling 对div里的换行敏感
- 组建一台计算机3_硬件3 多位运算器
- 数字数据fzu 2120 数字排列
- C/C++之变长数组(VLA)和可伸缩型数组成员