新闻  |   论坛  |   博客  |   在线研讨会
objcpy,objdump,readelf,nm
电子禅石 | 2021-04-24 17:28:24    阅读:2231   发布文章

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-littleelf32-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命令的使用



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段信息(如果有)


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客