linux的目标文件格式6,Linux目标文件分析方法

EFL格式主分类:

1.可重定向文件(Relocatable file):文件包含代码和数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。由编译器和汇编器生成,将由链接器处理。静态链接库(它是把很多目标文件捆绑在一起形成一个文件,再加上一些索引)也可以归为这一类。

实例:.o和.a文件

2.可执行文件(Executable File):文件包含了可以直接执行的程序,它的代表就是ELF可执行文件,它们一般没有扩展名。该文件指出了exec(BA_OS)如何来创建程序进程映象。所有重定向和符号都解析完成了,如果存在共享库的链接,那么将在运行时解析。

实例:/bin/bash文件

3.共享目标文件(Shared object file):就是所谓的共享库。文件包含代码和数据,可以在以下两种情况下使用。用来被下面的两个链接器链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定向和共享目标文件来创建其他的目标文件。第二个是动态链接器,联合一个可执行文件和其他的共享目标文件来创建一个进程映象。包含链接时所需的符号信息和运行时所需的代码。(一种是链接器可以使用这种文件跟其他可重定位文件和共享目标文件链接,产生新的目标文件。另一种是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行。)

4.核心转储文件(Core Dump FIle):当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件。

实例:Linux下得core dump

分析ELF文件的工具

1.File file.o

用来查看文件类型

ecbb6c3886f6075b0c03b2a07588f87a.png

2.objdump

用来查看object内部的结构

bdbacb63b20107d51f918583d6937ff7.png

参数“-h”就是把ELF文件的各个段的基本信息打印出来,也可以使用“-x”把更多的信息打印出来。

参数“-s”可以将所有段的内容以十六进制的方式打印出啦,“-d”可以将所有包含指定的段反汇编。

716b5605fa283a88e3f2bf846090032e.png

3. size

可以用来查看ELF文件的代码段、数据段和BSS段长度。

711b5fd9ebd23d13d88fe193ceb12f99.png

(dec表示段的和是十进制,hex表示段的和是16进制)

4. objcopy

该工具可以把一个二进制文件,比如图片作为目标文件的一个段

比如:objcopy -I binary -O elf32-i386 -B i386 image,jpg image.o

5.readelf

该命令可以查看ELF文件的详细信息

d152f1c2a5464619cc9f02de8107a7b1.png

-h参数用来查看elf文件头信息,-S参数可以用来查看文件段表的内容。

9fcc2bb2094a2c053a04648a4f635ebd.png

.rel.text的段的类型为REL,也就是说它是一个重定位表。链接器在处理目标文件时,需要对目标文件中某些部位进行重定位,即代码段和数据段中那些对绝对地址的引用的位置。这些重定位的信息都记录在ELF文件的重定位表里面,对于每个需要重定位的代码段或数据段,都会有一个相应的重定位表。

objdump -r simplesession.o 可以查看目标文件的重定位表。

段的标志位Flag表示该段在进程虚拟地址空间的属性,比如是否可写,是否可执行,是否需要在进程空间中分配空间。

6.nm

nm可以用来查看ELF文件的符号表。

bf4d6c45ee657829f3b2c9f5edb593c6.png

在链接过程中,函数和变量统称为符号。可以将符号看成是链接过程的粘合剂,整个链接过程正是基于符号才能正确完成。每个目标文件都会有一个相应的符号表。这个表里记录了目标文件中用到的所有符号,每一个定义的符号都有一个对应的值,叫做符号值,对于变量和函数来说,符号值就是他们的地址。

最值得关注的就是全局符号。ELF文件的符号表往往是文件中得一个段,段名一般叫“.symtab”。

另外,如果在GCC编译时加上-g参数,编译器会再产生的目标文件里加上调试信息,通过readelf可以看到,目标文件中多了很多“debug”相关的段。

需要说明的是,调试信息在目标文件中占用很大的空间,往往比程序的代码和数据本身大很多倍。可以使用strip命令去掉ELF文件中的调试信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值