ELF查看工具

工具

可用于查看分析 ELF 文件 的工具如下所示:

工具功能说明
strings输出 ELF文件 中的所有字符串
strip删除 ELF文件 中一些无用的信息
nm显示目标文件中的所有符号
size显示目标文件中的 section 大小及目标文件大小
readelf显示 ELF 文件中的内容,主要的 ELF分析工具
objdump显示目标文件的汇编信息,主要用于反汇编
ar将目标文件链接为静态库
addr2line将地址转换为文件、行号

nm

nm 的使用格式为 nm [-options] [files],当没有输入文件时,默认使用当前目录下的 a.out 文件作为输入。
几个关键字比较常用:

  • -A:列出符号名的时候并显示来自于文件来源,一般用于查看 多个文件(比如库文件) 的符号时比较有用
  • -a:列出所有符号,该选线会将 调试符号 也列出来。默认状态下 不显示 调试符号。
  • -l:列出符号在源代码中对应的行号,对于 未定义符号 显示为空
  • -n:根据符号的地址来排序,默认按符号名的字母顺序进行排序的
  • -u:只列出 未定义符号
  • –defined-only:只列出 已定义符号
  • -f:指定输出格式,可以使用 nm -f sysv 查看变量所在的节区
  • -r:按顺序打印出符号

下面是一个 nm 查看一个测试程序的符号,我们简单看一下输出:
在这里插入图片描述
其输出一共有 3 列,分别如下:

第一列:符号 起始地址
第二列:符号 类型
第三列:符号 名称

符号类型
如下表所示:

符号类型含义
A该符号的值是绝对的,在以后的链接过程中,不允许进行改变。该符号类型常常出现在中断向量表中,比如用符号来表示各个中断向量函数在中断向量表中的位置
B该符号出现在 BSS段 中,同时也位于 bss section。其值表示该符号在 BSS段 中的 偏移。一般而言,BSS段 分配于RAM中
D该符号位于 data段 中,同时也位于 *data section
N该符号是一个 调试符号
R该符号位于 只读数据区,比如由 const 修饰的变量或者字符串常量等
S该符号位于 非初始化数据区,一般也位于 rodata section
T该符号位于 代码段text section
U该符号在当前文件中是未定义的,即该符号的定义在别的文件

size

使用方法为: size file_name ,如图所示
在这里插入图片描述
其输出含义如下:

  • text:表示文件中指令的大小
  • data:表示文件有初值的全局变量和静态变量的大小
  • bss:表示文件中未赋初值或初值为 0 的全局变量和静态变量的大小
  • dec:text + data + bss
  • hex:dec 的 16 进制表示

eadelf

readelf 的 使用方法为:readelf [-options] [files]。下面列举几个我们常用的选项:

-h:查看 ELF文件头,其输出含义如下:

输出字段含义
Magic该行给出了ELF文件的一些标识信息
Entry point address程序入口的 虚拟地址。如果目标文件没有程序入口,可以为 0。在程序加载完成后,loader 会将程序指针转移到该地址
Start of program headers表明 程序头部表(program header)ELF文件 中的位置
Start of section headers表明 节区头部表(section header)ELF文件 中的位置
Size of this heade表明 ELF文件头 的大小。
Size of program headers表明 程序头部表 中每行的大小为 32 个字节
Number of program headers表明在 程序头部表 的行数,也就意味着程序的段数
Size of section headers表明 节区头部表 每行的大小
Number of section headers表明在 节区头部表 中的行数,也就意味着程序中节数

-S:查看 节(section) 信息,其输出字段为:

Type:节区类型,其含义如下:

段类型含义
NULL此值标志节区头部是非活动的,没有对应的节区。此节区头部中的其他 成员取值无意义
PROGBITS此节区包含程序定义的信息,其格式和含义都由程序来解释,代码节区数据节区 都是这种类型
SYMTAB此节区包含 符号表。符号表中每一个符号是值都是一个 数字,该数字是对应符号的符号名在 字符串表 中的下标
STRTAB此节区包含 字符串表,目标文件可能包含多个字符串表节区
RELA此节区包含 重定位表项。目标文件可能拥有多个重定位节区
HASH此节区包含 符号哈希表。所有参与动态链接的目标都必须包含一个 符号哈希表
DYNAMIC此节区包含 动态链接的信息
NOTE此节区包含以某种方式来标记文件的信息
NOBITS这种类型的节区不占用文件中的空间,其他方面和 SHT_PROGBITS 相似,如 bss段
DYNSYM动态链接符号表,它可能包含很多对动态链接而言不必要的符号
INIT_ARRAYmain函数 之前运行的函数指针数组
FINI_ARRAY在退出 main函数 之后,运行的函数指针数组
  • Addr:如果节区将出现在进程的内存映像中,此成员给出节区的第一个字节应处的位置。 否则此字段为 0
  • Off:表示该节内容在距离 文件起始 的偏移地址。
  • Size:表示该节在文件中的 大小
  • ES:某些节区中包含 固定大小 的项目,如 符号表。对于这类节区,此成员给出每个表项的 长度字节数 。 如果节区中并不包含固定长度表项的表格,此成员取值为 0
  • Flag: 表示该节的内存分配属性,A(分配内存) , X(可执行) , W(可写)
  • Lk: 此成员给出节区头部表 索引链接
  • AL: 某些节区带有 地址对齐约束
  • -l:查看 段(segment) 信息及 节与段之间的映射关系,其输出字段为:

Type:段类型,其含义如下:

段类型含义
PHDR此段给出了程序头部表自身的 大小位置,同时包括 在文件在内存 中的信息
INTERP该段给出一个 NULL结尾的字符串。该字符串将被当作解释器调用。对于 ELF文件 来讲,该段指定了启动进程的 Loader
LOAD该段是一个可加载的段,段的大小由 FileSizMemSiz 描述。文件中的字节被映射到内存段开始处
DYNAMIC该段给出动态链接信息
NOTE此段给出附加信息的位置和大小
  • Offset:该段在距离文件开头的 偏移地址
  • VirtAddr:此成员给出段的第一个字节将被放到内存中的 虚拟地址
  • PhysAddr:此成员仅用于与物理地址相关的系统中
  • FileSiz:此成员给出段在 文件映像 中所占的 字节数
  • MemSiz:此成员给出段在 内存映像 中占用的 字节数
  • Flg:该段的属性,R(可读),E(可执行),W(可写)
  • Align:表示该段的要求 字节对齐 属性

注意,MemSize 可能与 FileSize 不等,主要是因为 .bss段 只占据 内存空间,不占据 文件空间。

  • -r:查看 重定位节区信息
  • -s:查看 符号表
  • -d:读取 .dynamic段,该段包含 可执行文件所依赖的库

addr2line

addr2line的 使用方法为:addr2line[-options] [files]。下面列举几个我们常用的选项:

  • -e:指定 可执行文件,在 执行文件 需要在编译时加入 -g 选项来加入调试信息

objdump

  • -h:打印 ELF文件 中所有 section头,输出字段如下:
  • Idx Name:section 名
  • Size:大小
  • File off:在文件中的偏移
  • -r:查看目标文件的 静态 重定位表:
  • OFFSET:重定位入口偏移
  • TYPE:重定位入口类型
  • VALUE:重定位入口的符号
  • -R:查看共享对象的 动态 重定位表:

objcopy

bjcopy 可以将 非ELF文件 编译为 section,使其能够直接链接到 可执行文件 中。
其使用方法为 objcopy [-optoins] input output
常用选项如下:

  • -I:输入文件格式
  • O:输出文件格式
  • -B:设置输出文件的体系架构,比如i386
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Windows操作系统中,我们无法直接查看和解析ELF文件。因为ELF是一种针对Unix和Linux系统的可执行文件格式,而Windows使用的是PE(Portable Executable)格式。 如果我们想查看ELF文件内部的内容,我们可以使用一些第三方工具来实现。例如,我们可以使用一个名为"readelf"的命令行工具。需要注意的是,这个工具必须在Windows上安装一个UNIX环境(如Cygwin或MinGW),因为它是专为Unix和Linux操作系统设计的。 使用readelf工具,我们可以在命令行中执行类似于以下的命令:readelf -a filename,其中"filename"是要查看ELF文件的路径和名称。该命令将显示ELF文件的所有节(sections)和程序头(program headers)的详细信息,包括节类型、地址、大小、文件偏移等。 另外,我们还可以使用一些反汇编工具,如IDA Pro或Ghidra,来分析查看ELF文件的汇编代码和符号表。这些工具通常被用于逆向工程和恶意软件分析。 总而言之,在Windows操作系统中查看ELF文件需要使用第三方工具,并且需要一些额外的配置和安装。这主要是因为ELF是Unix和Linux操作系统特有的文件格式,与Windows操作系统并不兼容。 ### 回答2: 在Windows上查看elf文件可以通过以下几种方法进行: 1. 使用专门的ELF文件查看器:可以通过在Windows上安装专门的ELF文件查看器来浏览和查看elf文件。这些工具通常提供了丰富的功能,包括查看文件的头部信息、节区、符号表、重定位表等。 2. 使用反汇编工具:在Windows上安装反汇编工具,比如IDA Pro、radare2等,可以将elf文件导入并进行反汇编,查看其汇编代码和程序逻辑。这些工具通常对符号表和重定位表的解析也比较准确,可以帮助理解elf文件的结构和内容。 3. 使用调试器:在Windows上安装调试器,如GDB或LLDB等,可以将elf文件加载到调试器中,并进行断点调试和变量查看等操作。调试器可以帮助我们深入了解elf文件的执行过程,分析其运行时行为,以及查看内存、寄存器等信息。 4. 使用文件查看工具:使用Windows自带的文件查看工具,如Hex编辑器,可以直接打开elf文件查看其16进制内容。但需要注意的是,elf文件的结构比较复杂,仅仅查看16进制内容可能无法完全理解其含义,需要结合其他工具来解析。 无论使用哪种方法,我们都需要了解elf文件的结构和格式,以及对应的解析方法,才能准确地查看和理解elf文件的内容。 ### 回答3: 在Windows上查看ELF文件可以通过安装相应的工具来实现。ELF(Executable and Linkable Format)是一种可执行和可链接文件的标准文件格式,主要用于UNIX和类UNIX操作系统。虽然Windows操作系统通常不直接支持ELF文件,但仍然可以用一些工具进行查看。 一种常用的工具是使用Windows上的GCC编译器。GCC是一个开源的编译器套件,包含了很多不同平台上的工具。其中包括一个名为objdump的工具,可以查看分析各种格式的目标文件,包括ELF文件。可以通过下载和安装MinGW或者Cygwin来获取GCC的Windows版本,并使用其中的objdump工具。 另外,还有一些独立的ELF查看工具可以使用。比如ELF Viewer、elfdump等。这些工具可以提供ELF文件的各种信息,如ELF头部信息、节表、符号表等,以及可以进行反汇编查看代码等功能。 通过这些工具,我们可以查看ELF文件的结构和内容,了解代码和数据的布局、查看符号表、段信息等。可以帮助我们进行ELF文件分析和调试,以及了解文件中包含的函数、变量等信息。 总之,在Windows上查看ELF文件需要使用特定的工具,如GCC套件中的objdump工具或者独立的ELF查看工具,这些工具可以帮助我们了解ELF文件的结构和内容,进行分析和调试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值