Linux下反汇编相关工具

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 启用或禁用递归量限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值