1. objcopy 复制及修改目标文件
    -I  :   输入文件的格式(binary, elf32-i386等)
    -O  :   输出文件的格式
    -B  :   二进制文件体系结构(i386, arm等)
    -R  :   删除不用的section(.comment  .note 等)
    -j  :   仅留下有用的section(.text  .data 等)
    -S  :   不复制重定位和符号信息
    -K  :   保留某个符号
    -N  :   去掉某个符号
    -L  :   使某个符号local化
    -W  :   使某个符号weaken化
    例如:  objcopy -S -O binary -j .text  a.out  a.bin   只保留.text的二进制文件.
2. objdump 显示目标文件信息
    -f  :   显示文件头信息(参考readelf -h)
    -d  :   反汇编目标文件中需要执行指令的section
    -D  :   反汇编目标文件中所有的section
    -h  :   显示section 头信息(参考readelf -S)
    -x  :   显示所有信息(参考readelf -a)
    -s  :   显示各个section的十六进制码以及对应的ascii码
    -m  :   CPU架构
    -b  :   目标文件格式,默认elf32,可以指定为binary二进制格式.
    例如: objdump -D -b binary -m i386 a.bin  对二进制文件进行反汇编
3. readelf 显示目标elf文件信息
    -a  :   显示所有信息
    -h  :   显示elf头信息
    -l  :   显示Program Header Table中的每个Entry信息
    -S  :   显示Section Header Table中的每个Entry信息
    -g  :   显示Section Group信息
    -s  :   显示Symbol Table中的每个Entry信息
    -e  :   等同于 -h + -l + -s
    -n  :   显示.note段信息
    -r  :   显示可重定位信息
    -d  :   显示Dynamic Section信息
4. nm 列出目标文件中的符号
    -a  :   列出所有符号,包括debugger-only的符号.
    -A  :   显示文件名
    -g  :   只显示外部符号
    -C  :   将低级符号解码(demangle)成用户级名字,使C++函数名具有可读性.
    -D  :   显示Dynamic符号
    -u  :   仅显示没有定义的符号
    -r  :   反序显示
    -n  :   按地址顺序显示
  nm列出符号的地址,符号类型和符号名字.其中符号说明如下:
    A   :   绝对地址,链接时不改变.
    B   :   符号位于bss数据段
    C   :   符号为common. common symbol是未初始化数据段(参考汇编文件中.common)
    D   :   已初始化数据段中的符号
    G   :   符号位于已初始化数据段中,重要用于small data object提高访问速度.
    I   :   该符号是对另一个符号的间接引用
    N   :   该符号是一个debugging符号
    R   :   只读数据去符号(C语言中的const修饰)
    S   :   符号位于非初始化数据区,用于small object
    T   :   符号位于text section
    U   :   符号未定义
    V   :   该符号是一个weak object
    W   :   弱符号
    ?   :   类型未定义
objcopy使用说明
objcopy用于将object的部分或全部内容拷贝到另一个object,从而可以实现格式的变换。
objcopy可用用于将文件转换成S-record格式或者raw二进制格式。
例如,
         xxxx-elf-objcopy –O srec test.o test.s19
则将test.o转换成s-record文件中。通常涉及到text段。
         xxxx-elf-objcopy –O binary test.o test.bin
则将test.o转换成raw binary文件格式。
       当将object文件转换成raw binary格式时,通常将去除掉symbols和relocation信息。在生成s-record过程中,有时需要用选项“-S”,“-R”去除掉binary文件,s-record文件不需要的相应信息。
此外,还需要注意到使用objcopy不能够改变大、小endian。
 
| 选项 | Desc | 
| infile/outfile | 源文件/目标文件 | 
| -I bfdname --input-target=bfdname | 输入文件的bfdname,可取值elf32-little,elf32-big等,可用用objdump –I查看相应的信息 | 
| -O bfdname --output-target=bfdname | 输出文件的bfdname | 
| -F bfdname --target=bfdname | 指定输入、输出文件的bfdname,目标文件格式 | 
| -j sectionname --only-section=sectionname | 只将由sectionname指定的section拷贝到输出文件 | 
| -R sectionname --remove-section=sectionname | 去除掉由sectionname指定的section | 
| -S --strip-all | 去掉源文件的符号信息和relocation信息 | 
| -g --strip-debug | 去除掉调试符号信息和相关的段 | 
| -K symbolname --keep-symbol=symbolname | 保留由symbolname指定的符号信息 | 
| -N symbolname --strip-symbol=symbolname | 去除掉由symbolname指定的符号信息 | 
| -G symbolname --keep-global-symbol=symbolname -L symbolname --localize-symbol=symbolname -W symbolname --weaken-symbol=symbolname -w --wildcard -x --discard-all -X --discard-locals | 处理符号 | 
| -b byte --byte=byte | 每byteth byte中保留1 byte | 
| -i interleave --interleave=interleave | 每隔interleave字节拷贝1 byte | 
| --gap-fill val | 在section中填充val | 
| --set-start val | 设定新文件的start address | 
| --change-start incr --adjust-start incr | 调整start address | 
| --change-address incr --adjust-vma incr | 调整所有sections的VMA(virtual memory address)和LMA(linear memory address)。 | 
| --change-section-address         section{=,+,-}val --adjust-section-vma section        {=,+,-}val | 调整指定section的VMA/LMA地址 | 
| --set-section-flags section=flag | 指定指定section的flag,flag的取值可以alloc,contents, load, noload, readonly, code, data, rom, share, debug | 
| --add-section sectionname=filename | 添加一个section,该section的内容为filenmae的内容 | 
| --rename-section oldname=     newname[,flags] | 更改section的名 | 
| -V --version | objcopy的version number | 
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:
objdump -f test
显示test的文件头信息
objdump -d test
反汇编test中的需要执行指令的那些section
objdump -D test
与-d类似,但反汇编test中的所有section
objdump -h test
显示test的Section Header信息
objdump -x test
显示test的全部Header信息
objdump -s test
除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
举例:
将C源代码和反汇编出来的指令对照:
1.
编译成目标文件(要加-g选项)
gcc -g -o test.c
2.
输出C源代码和反汇编出来的指令对照的格式
objdump -S test.o
如下:

如何对任意一个二进制文件进行反汇编?
我们可以这样做:
objdump -D -b binary -m i386 a.bin
-D表示对全部文件进行反汇编,-b表示二进制,-m表示指令集架构,a.bin就是我们要反汇编的二进制文件
objdump -m可以查看更多支持的指令集架构,如i386:x86-64,i8086等
另外上面的所有objdump命令的参数同样适用于arm-linux-objdump。
同时我们也可以指定big-endian或little-endian(-EB或-EL),我们可以指定从某一个位置开始反汇编等。所以objdump命令是非常强大的!
readelf命令的使用  readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍:
 
readelf -v
显示版本
readelf -h
显示帮助
readelf -a test
显示test的全部信息
readelf -h test
显示test的ELF Header的文件头信息(就是ELF文件开始的前52个字节)
readelf -l test
显示test的Program Header Table中的每个Prgram Header Entry的信息(如果有)
readelf -S test
显示test的Section Header Table中的每个Section Header Entry的信息(如果有)
readelf -g test
显示test的Section Group的信息(如果有)
readelf -s test
显示test的Symbol Table中的每个Symbol  Table Entry的信息(如果有)
readelf -e test
显示test的全部头信息(包括ELF Header,Section Header和Program Header,等同与 readelf -h -l -S test)
readelf -n test
显示test的note段的信息(如果有)
readelf -r test
显示test中的可重定位段的信息(如果有)
readelf -d test
显示test中的Dynamic Section的信息(如果有)
readelf -V test
显示test中的GNU Version段信息(如果有)
        	*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。