作者:冯老师,

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下目标文件分析相关推荐

  1. Linux下统计当前文件夹下的文件个数、目录个数

    这篇文章主要介绍了Linux下统计当前文件夹下的文件个数.目录个数,本文使用ls命令配合管理.grep命令实现统计需求,需要的朋友可以参考下 1) 统计当前文件夹下文件的个数 复制代码 代码如下: l ...

  2. linux shell判断当前目录下的文件或目录

    linux shell判断当前目录下的文件或目录 #!bin/sh for file in ./* doif test -f $filethenecho $file 是文件elseecho $file ...

  3. linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...

    1.批量查找某个目下文件的包含的内容 cd etc grep -rn "查找的内容" ./ 2.批量替换某个目下所有包含的文件的内容 cd etc sed -i "s/查 ...

  4. linux du 文件大小排序,du命令 实现Linux 某个文件夹下的文件按大小排序

    1. df -lh 2. du -s /usr/* | sort -rn 这是按字节排序 3. du -sh /usr/* | sort -rn 这是按兆(M)来排序 4.选出排在前面的10个 du ...

  5. 【转】【Linux】Linux下统计当前文件夹下的文件个数、目录个数

    [转][Linux]Linux下统计当前文件夹下的文件个数.目录个数 统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 统计文件夹下目录的 ...

  6. Linux统计文件夹下的文件数量

    统计某文件夹下目录文件的个数,统计文本文件的数量 Linux下有三个命令:ls.grep.wc 通过这三个命令的组合可以统计目录下文件及文件夹的个数.ls常用命令介绍 统计当前目录下文件的个数(不包括 ...

  7. linux如何统计目录下的文件个数,linux怎么查看一个目录下的文件数量

    有时候需要看文件夹下有多少文件,那么就需要用到以下指令 $ls -l | grep -c '^-' 个grep是啥意思呢?我们man一下 $man grep 会看到以下描述: SYNOPSIS gre ...

  8. Linux C 读取文件夹下所有文件(包括子文件夹)

    Linux C 读取文件夹下所有文件(包括子文件夹) 递归读取某文件夹及其子文件夹下所有文件名 深入探讨:linux中遍历文件夹下的所有文件 Linux C :遍历输出指定目录下的所有文件 Linux ...

  9. linux 压缩当前文件夹下所有文件

    linux zip压缩.压缩当前文件夹下所有文件,压缩为a.zip.命令行的方法是怎样. zip -r fileName.zip 文件夹名 tar tar命令可以用来压缩打包单文件.多个文件.单个目录 ...

  10. linux中断处理模式,Linux在保护模式下的中断处理分析.pdf

    Linux在保护模式下的中断处理分析.pdf Linux 在保护模式下的中断处理分析 刘万里 杨 斌 (西南交通大学计算机与通信工程学院,成都 610031) E-mail:awan@ 摘 要 该文以 ...

最新文章

  1. mysql 上亿记录_一入职!就遇到上亿(MySQL)大表的优化....
  2. python数据模型的意义_Python 数据模型
  3. Unreal Engine 4 —— Post Process Shader练手(HLSL)
  4. Infortrend EonStor GS赢得 “年度最佳混合式存储”大奖
  5. 对 Entity 的初步构思
  6. spyder开多个程序_【程序源代码】基于Vue+ElementUI web开发框架
  7. 交互键盘_如何仅为键盘交互添加聚焦环
  8. adb 提示:error: unknown host service解决方法
  9. OAuth2.0授权协议与客户端授权码模式详解
  10. java开发web使用struts2,springMVC和spring,Jquery的理由?
  11. 即将面世——AWS SDK for Go
  12. 设计模式系列2-设计模式分类及23种设计模式中英文名称对照
  13. 软件测试简历上的职业技能怎么写,软件测试岗位个人简历个人技能范文
  14. 安全多方学习开源框架调研
  15. 【错误记录】Git 使用报错 ( error: The branch ‘feature1‘ is not fully merged. )
  16. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(1):关于STM32核心外设
  17. i2c-tool调试工具使用方法介绍
  18. 记go语言椭圆曲线算法公私钥验证补充
  19. echarts柱状图顶部数据显示气泡
  20. 知乎500万人热议:如何快速培养英语思维方式?

热门文章

  1. php 多组radiobutton,实现多行多列的RadioButton
  2. Android利用有道API播放英文发音
  3. 定时执行python脚本
  4. 互联网进入中国的先驱是谁?
  5. 第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 D题
  6. TCP协议--流量控制,拥塞控制,MSS
  7. 刷新DNS命令 如何刷新DNS缓存(flushdns)
  8. MacOSX VMware Fusion 虚拟机黑屏的解决方案
  9. SSH简单爆破及漏洞利用
  10. WPF前端:按钮控件属性Button