Linux下反汇编相关工具
程序出现崩溃堆栈,如果事先没有装调试包或者以调试模式编译,则打出的堆栈中看不到函数名,或者显示 n/a
。此时往往需要根据 backtrace
打印的函数偏移地址来确定调用的是什么函数,这里就涉及到比较高级的调试技巧。
查看ELF文件信息
ldd
显示可执行文件或共享库所依赖的共享库。
Usage: ldd [OPTION]... FILE...--help print this help and exit (获取指令帮助信息)--version print version information and exit (打印ldd的版本号)-d, --data-relocs process data relocations (执行重定位和报告任何丢失的对象)-r, --function-relocs process data and function relocations (执行数据对象和函数的重定位,并且报告任何丢失的对象和函数)-u, --unused print unused direct dependencies (打印未使用的直接依赖)-v, --verbose print all information (详细信息模式,打印所有信息,例如包括符号的版本信息)
nm
linux下nm命令的基本使用以及输出符号类型详解_nm命令中符号类型详解-CSDN博客
列出库文件(.a、.lib)、目标文件(*.o)、可执行文件的符号表。
-A 或 -o 或 --print-file-name:打印出每个符号属于的文件
-a 或 --debug-syms:显示调试符号。
-B:等同于–format=bsd,用来兼容MIPS的nm。
-C 或 --demangle:将低级符号名解码(demangle)成用户级名字。
-D 或 --dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
-f forma 或 --format=formatt:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
-g 或 --extern-only:仅显示外部符号。
-n 、-v 或 --numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
-p 或 --no-sort:按目标文件中遇到的符号顺序显示,不排序。
-P 或 --portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
-s 或 --print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
-r 或 --reverse-sort:反转排序的顺序(例如,升序变为降序)。
--size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
-t radix 或 --radix=radix:使用radix进制显示符号值。radix只能为“d”表示十进制、“o”表示八进制或“x”表示十六进制。
--target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
-u 或 --undefined-only:仅显示没有定义的符号(那些外部符号)。
-l 或 --line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。
readelf
查看ELF文件信息。
-a 显示所有可用信息
-h 显示ELF文件头
-l 显示程序头部列表(也就是段)
-S 显示节头部列表
-g 显示节组信息
-t 显示节的详细信息
-e 显示节和程序头部的完整信息
-s 显示符号表条目
-r 显示重定位条目
-d 显示动态段
-n 显示笔记段
-u 显示未定义的符号
-v 显示版本信息
-x <number/hex> 显示给定节的十六进制转储
-p <number/hex> 显示给定节的字符串内容
-c 显示压缩节的信息
-i 显示动态节的信息
-m 显示ELF机器类型
objdump
Linux下反编译命令objdump快速学习总结(附实例操作)_linux反编译-CSDN博客
反汇编目标文件或者可执行文件。
-C 或 --demangle 将底层的符号名解码成用户级名字(即demangle)。
-d 或 --disassemble 从objfile中反汇编那些特定指令机器码的section。
-D 或 --disassemble-all 与 -d 类似,但反汇编所有section。
-f 或 --file-headers 显示objfile中每个文件的整体头部摘要信息。
-j name或 --section=name 仅仅显示指定名称为name的section的信息
-l 或 --line-numbers 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。
-s 或 --full-contents 显示指定section的完整内容。默认所有的非空section都会被显示。
-S 或 --source 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
-T 或 --dynamic-syms 显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D --dynamic 显示的信息。
-m machine 指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构
-h 或 --section-headers或 --headers 显示目标文件各个section的头部摘要信息。
-i 或 --info 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
addr2line
经常和
dmesg
一起使用:Linux下addr2line命令用法-CSDN博客
将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。
-a 在函数名、文件名和行号信息之前,以十六进制形式显示地址。
-b 指定目标文件的格式为bfdname。
-C 将低级别的符号名解码为用户级别的名字(即demangle)。
-e 指定需要转换地址的可执行文件名,默认文件是a.out。
-f 在显示文件名、行号信息的同时显示函数名。
-s 仅显示每个文件名(the base of each file name)去除目录名。
-i 如果需要转换的地址是一个内联函数,则还将打印返回第一个非内联函数的信息。
-j 读取指定section的偏移而不是绝对地址。
-p 使打印更加人性化:每个地址(location)的信息都打印在一行上。
-r 启用或禁用递归量限制。