Linux下目标文件分析
文章来源:华清远见嵌入式学院,原文地址:http://www.embedu.org/Column/Column699.htm
作者:冯老师,华清远见嵌入式学院讲师。
1. 程序源码如下:
2.命令
gcc –E simple_section.c –o simple_section.i
gcc –S simple_section.i –o simple_section.s
gcc –c simple_section.s –o simple_section.o
gcc simple_section.o –o a.out
3. Elf文件头
ELF目标文件格式的最前部是ELF文件头,它包含了描述整个文件的基本属性,包括ELF魔数、文件机器字节长度、数据存储方式、版本、运行平台、ABI版本、ELF重定位类型、硬件平台、硬件平台版本、入口地址、程序头入口和长度、段表的位置和长度及段的数量等。
文件头的结构体定义如下:
使用”readelf –h”命令可以查看目标文件头文件的内容:
magic是结构体的第一个成员e_indent,16个字节:
最开始的4个字节是所有的ELF文件都必须相同的标识码,分别为0x7f, 0x45, 0x4c,0x 46。第一个字节对应ASCII字符里的DEL控制符,后面3个字节刚好是ELF这三个字母的ASCII值。
4. 段表
ELF文件中有很多段,段表就是保存这些段的基本属性的结构。包括每个段的段名、段的长度、在文件中的偏移、读写权限及段的其他属性。也就是说ELF文件段的结构式由段表决定的,编译器、连接器和装载器都是依靠段表来定位和访问各个段的属性的。
段表的定义如下:
“objdump –h”命令只是显示关键段,省略了辅助性的段。”readelf -S”命令显示的更完整。
已初始化的全局变量和局部静态变量,都保存在.data段。未初始化的全局变量和局部静态变量一般放在.bss段。
但是,这个例子里,bss段只占4个字节。
通过下面的符号表,可以看出只有static_var2变量放在了bss段中,global_uninit_var并没有放在任何的,只是一个未定义的“COMMON符号”,这和编译器有关,全局的未初始化变量,有的放在bss 段,有的则不放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候,再在bss段分配空间。
备注:
1) .bss段在”objdump -h”的输出结果中,没有“CONTENTS”,因此不存在。
2) .comment段:存放的是编译器版本信息,比如字符串“GCC:(GNU)4.2.0”
3) .shstrtab : Section String Table.段名表
4) .strtab:string table字符串表
5) .symtab: Symbol Table符号表
6) .rel.text: 告诉链接器指令中的哪些地方需要做重定位
7) .objdump –s simple_section.o命令可以显示所有段的内容。
8) .hexdump –C simple_section.o 命令,可以把目标文件中的所有字节都打印出来。
start of section headers是372字节,十六进制后是0x00000174。和下图中section table的起始地址是一致的。
再结合”readelf –S simple_section”的结果,注意Al属性,会有对齐,可以画出下面的图:
最后的0x51c刚好是1308字节,是simple_section.o的大小。
Linux下目标文件分析的更多相关文章
- LINUX下目标文件的BSS段、数据段、代码段
http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 r ...
- Linux下的文件及文件后缀名
Linux下的文件及文件后缀名 2013-03-14 15:34 6969人阅读 评论(0) 收藏 举报 ++++++++++++++++++++++++++++++++++++++正文+++++++ ...
- (转)Linux下查看文件和文件夹大小 删除日志
场景:在sts中执行自动部署时候maven提示No space left on device错误,后来经检查发现是磁盘空间满了,用下面的方法分析发现tomcat下面的logs目录占用了很大的空间,删除 ...
- Linux Linux下最大文件描述符设置
Linux下最大文件描述符设置 by:授客 QQ:1033553122 1. 系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...
- [转载]linux下core文件设置与查看
转自:https://blog.csdn.net/dingqinghui/article/details/77855330?locationNum=9&fps=1 linux下core文件设置 ...
- Linux下的文件与目录权限
一.用户(User).群组(Group)和其他人(Others) linux是多用户多任务的操作系统,同一时刻可能会有多个用户登录系统,考虑到文件的安全性等问题,所以Linux下的文件都属于一个特定的 ...
- Linux下日志文件监控系统Logwatch的使用记录
Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...
- Linux下搜索文件find、which、whereis、locate
Linux下搜索文件find.which.whereis.locate: - which 寻找“执行文件” - -a 将所有可找到的命令均列出,而不仅仅列出第一个找到的命令名称 - whereis 寻 ...
- Linux下查看文件和文件夹大小 删除日志
场景:在sts中执行自动部署时候maven提示No space left on device错误,后来经检查发现是磁盘空间满了,用下面的方法分析发现tomcat下面的logs目录占用了很大的空间,删除 ...
随机推荐
- float 的有效数字为七位是怎么得出来的
以下内容来自CSDN网友xian_wwq的回答(http://bbs.csdn.net/topics/390874239): float: 1bit(符号位) 8bits(指数位) 23bits( ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST
E. Minimum spanning tree for each edge Connected undirected weighted graph without self-loops and ...
- 两种方法获取shadow ssdt
ULONG GetShadowSsdtCurrentAddresses( PSSDT_ADDRESS AddressInfo, PULONG Length ) { PSYSTEM ...
- github 使用网址
[Github教程]史上最全github使用方法:github入门到精通 http://blog.csdn.net/hcbbt/article/details/11651229 githup的使用 h ...
- loadruner知识点小结
1.Download Filters功能 帮助在回放脚本的时候对某些特定的访问进行屏蔽,解决页面读取中跨服务器带来数据影响的问题. 过滤规则中有3中策略,即URL.Host.HostSfx 区别于: ...
- 大端模式 VS 小端模式
简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面的东西,对于软件来说通常是透明的.再说 ...
- C# break continue return
break:跳出当前循环,执行循环后的代码 continue:跳出当前循环,执行下一次循环 return:跳出整个方法
- Android 6.0权限
在android 6.0 Marshmallow版本之后,系统不会在软件安装的时候就赋予该app所有其申请的权限,对于一些危险级别的权限,app需要在运行时一个一个询问用户授予权限. 只有那些targ ...
- poj2385 dp(递推)
题目链接 :http://bak3.vjudge.net/contest/136499#problem/D 题意: //转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1] ...
- 解决js小数求和出现多位小数问题
在小数相加时,可能会产生多个小数位.如下所示: var x=1+1; //2 var x=1.20+1.11; //2.31 var x=1.56+1.76; //3.3200000000 ...