可重定位目标文件中给出了其中常见的段,解释了每个段的含义和用途。目标文件里有什么(ELF文件结构)中对这些段又做了详细的解释,用到的时候只需查询即可。
列举常用命令:
readelf -h elf-file
:查看ELF文件头readelf -S
、objdump -h elf-file
:查看段表结构,即一个文件有那些段。objdump -s elf-file
:将所有段的内容以16进制打印出来。objdump -d elf-file
:将所有代码段的内容反汇编,段表中flags为AX
的都为代码段。readelf -p sh_name elf-file
:查看字符串表,即sh_name的type为STRTAB
的段的内容。查看代码段相关的内容只需要objdump -d
反汇编即可;查看数据段相关的值需要objdump -s
将16进制打印出来;。
静态链接就是就是将几个输入目标文件加工后合并成一个输出文件,整个链接过程分两步:空间与地址分配、符号解析与重定位。
列举常用命令:
objdump -r elf-file
:查看重定位表中的内容,rel.*
和rela.*
开头的段(type为RELA)均为重定位表。readelf -r elf-file
:也可以看查看重定位表中的信息。readelf -s
、objdump -t
、nm elf-file
:查看符号表。动态链接的3大步骤:启动动态链接器本身 → 装载所有需要的共享对象 → 重定位和初始化。
相关的段有.interp(动态链接器的位置)、.dynamic(动态链接所需信息)、.dynstr(动态符号表)以及动态链接重定位表。
列举常用命令:
readelf -l elf-file
:查看程序头。readelf -d elf-file
:查看.dynamic段中的内容。readelf -sD elf-file
:查看ELF文件的动态符号表及其哈希表。objdump -R elf-file
:查看动态重定位信息,也可以使用readelf -s
查看。用法:objdump <选项> <文件>
显示对象<file>的信息
至少要给出以下开关之一:
-a, --archive-headers 显示档案头信息
-f, --file-headers 显示整个文件头的内容
-p, --private-headers 显示特定对象格式的文件头内容
-P, --private=OPT,OPT... 显示对象格式的具体内容
-h, --[section-]headers 显示section headers的内容
-x, --all-headers 显示所有头文件的内容
-d, --disassemble 显示可执行部分的汇编器内容
-D, --disassemble-all 显示所有部分的汇编内容
-S, --source 将源代码与反汇编混合在一起
-s, --full-contents 显示所有要求的部分的完整内容
-g, --debugging 显示对象文件中的调试信息
-e, --debugging-tags 使用ctags样式显示调试信息
-G, --stabs 显示(原始形式)文件中的任何STABS信息
-W[lLiaprmfFsoRt] 或
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames、
=frames-interp,=str,=loc,=Ranges,=pubtypes、
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges、
=addr,=cu_index] 显示文件中的DWARF信息
-t, --syms 显示符号表的内容(s)。
-T, --dynamic-syms 显示动态符号表的内容
-r, --reloc 显示文件中的重定位条目
-R, --dynamic-reloc 显示文件中的动态重定位条目 @<file> 从<file>读取选项
-v, --version 显示这个程序的版本号
-i, --info 列出支持的对象格式和架构
-H, --help 显示这些信息
下面的开关是可选的:
-b, --target=BFDNAME 将目标对象格式指定为BFDNAME
-m, --architecture=MACHINE 指定目标架构为 MACHINE
-j, --section=NAME 只显示NAME部分的信息
-M, --disassembler-options=OPT 将文本OPT传给反汇编程序
-EB --endian=big 在反汇编时假定为大的endian格式
--EL --endian=little 在反汇编时假定为小恩典格式
--file-start-context 从文件的开头列入上下文(与-S一起)。
-I, --include=DIR 将DIR加入源文件的搜索列表中
-l, --line-numbers 在输出中包括行号和文件名
-F, --file-offsets 在显示信息时包括文件的偏移量
-C, --demangle[=STYLE] 解码经过处理的符号名称,如果指定STYLE,可以是`auto'、`gnu'、
`lucid', `arm', `hp', `edg', `gnu-v3', `java'或 "gnat"。
-w, --wide 格式化80列以上的输出
-z, --disassemble-zeroes 在反汇编时不跳过零块。
--start-address=ADDR 只处理地址大于等于ADDR的数据
--stop-address=ADDR 只处理地址为<=ADDR的数据
--prefix-addresses 在反汇编的同时打印完整的地址
--[no-]show-raw-insn 在符号反汇编的同时显示十六进制。
--insn-width=WIDTH 在单行上显示WIDTH字节,用于 -d
--adjust-vma=OFFSET 在所有显示的部分地址上增加OFFSET
--special-syms 在符号转储中包括特殊符号
--prefix=PREFIX 在绝对路径中增加PREFIX,用于-S
--prefix-strip=LEVEL 剥离-S的初始目录名称
--dwarf-depth=N 不显示深度为N或以上的DIEs
--dwarf-start=N 显示以N开头的DIE,在相同的深度上或更深
--dwarf-check 做额外的矮人内部一致性检查。