objdump

objdump

fetch150zy

在linux下有关obj目标文件的分析

Linux下obj分析

objdump

基础用法

==-h==查看对象文件的所有sections的头部摘要信息

==-f==显示目标文件的整体头部摘要信息

==-t==查看目标文件符号表

==-d==对目标文件进行反汇编(只对包含指令的sections进行反汇编)

==-D==对目标文件进行反汇编

==-j==显式指定sections信息

常用符号表字段

  • ==.text==:已编译程序的机器代码
  • ==.rodata==:只读数据
  • ==.data==:已初始化的全局变量
  • ==.bss==:未初始化的全局变量,目标文件格式区分初始化和未初始化变量只是为了空间效率,在目标文件中,未初始化变量不需要占用任何实际的磁盘空间
  • ==.symtab==:符号表,存放程序中被定义和引用的函数和全局变量的信息
  • ==.rel.txt==:当链接器把目标文件和其他文件结合时,==.text==段中的许多内容都需要修改
  • ==.rel.data==:被模块定义或引用的任何全局变量的信息,一般而言任何已初始化的全局变量或者外部定义函数的地址都需要被修改
  • ==.debug==:调试符号表,以==-g==选项编译程序时才会有
  • ==.line==:原始程序的行号和==.text==段中机器指令之间的映射,以==-g==选项编译程序时才会有
  • ==.strtab==:字符串表,其内容包括==.symtab==和==.debug==段中的符号表,以及段头部中的段名字

ar

创建静态链接库

1
2
3
$ ar -rc libxxx.a xxx.o yyy.o ...
# 查看lib的成员
ar -t libxxx.a

nm

==nm==命令用于列出目标文件的symbols

对于列出的每一个symbol,nm会显示如下信息

  • ==symbol value== 以指定基数来显示symbol的值,默认是十六进制
  • ==symbol type==
  • ==symbol name==
1
2
3
4
$ nm -As libxxx.a
-A or -o 在列出的symbol前面显示该符号所在.o文件名
-a 显示所有的symbols信息,包括用于调试的symbols
-s 列出所有的symbols时也列出索引