博客專欄

EEPW首頁(yè) > 博客 > objcpy,objdump,readelf,nm

objcpy,objdump,readelf,nm

發(fā)布人:電子禪石 時(shí)間:2021-04-24 來(lái)源:工程師 發(fā)布文章

1. objcopy 復(fù)制及修改目標(biāo)文件
    -I  :   輸入文件的格式(binary, elf32-i386等)
    -O  :   輸出文件的格式
    -B  :   二進(jìn)制文件體系結(jié)構(gòu)(i386, arm等)

    -R  :   刪除不用的section(.comment  .note 等)
    -j  :   僅留下有用的section(.text  .data 等)
    -S  :   不復(fù)制重定位和符號(hào)信息
    -K  :   保留某個(gè)符號(hào)
    -N  :   去掉某個(gè)符號(hào)
    -L  :   使某個(gè)符號(hào)local化
    -W  :   使某個(gè)符號(hào)weaken化

    例如:  objcopy -S -O binary -j .text  a.out  a.bin   只保留.text的二進(jìn)制文件.


2. objdump 顯示目標(biāo)文件信息
    -f  :   顯示文件頭信息(參考readelf -h)
    -d  :   反匯編目標(biāo)文件中需要執(zhí)行指令的section
    -D  :   反匯編目標(biāo)文件中所有的section
    -h  :   顯示section 頭信息(參考readelf -S)
    -x  :   顯示所有信息(參考readelf -a)
    -s  :   顯示各個(gè)section的十六進(jìn)制碼以及對(duì)應(yīng)的ascii碼
    -m  :   CPU架構(gòu)
    -b  :   目標(biāo)文件格式,默認(rèn)elf32,可以指定為binary二進(jìn)制格式.

    例如: objdump -D -b binary -m i386 a.bin  對(duì)二進(jìn)制文件進(jìn)行反匯編


3. readelf 顯示目標(biāo)elf文件信息

    -a  :   顯示所有信息
    -h  :   顯示elf頭信息
    -l  :   顯示Program Header Table中的每個(gè)Entry信息
    -S  :   顯示Section Header Table中的每個(gè)Entry信息
    -g  :   顯示Section Group信息
    -s  :   顯示Symbol Table中的每個(gè)Entry信息
    -e  :   等同于 -h + -l + -s
    -n  :   顯示.note段信息
    -r  :   顯示可重定位信息

    -d  :   顯示Dynamic Section信息


4. nm 列出目標(biāo)文件中的符號(hào)
    -a  :   列出所有符號(hào),包括debugger-only的符號(hào).
    -A  :   顯示文件名
    -g  :   只顯示外部符號(hào)
    -C  :   將低級(jí)符號(hào)解碼(demangle)成用戶級(jí)名字,使C++函數(shù)名具有可讀性.
    -D  :   顯示Dynamic符號(hào)
    -u  :   僅顯示沒(méi)有定義的符號(hào)
    -r  :   反序顯示
    -n  :   按地址順序顯示

  nm列出符號(hào)的地址,符號(hào)類型和符號(hào)名字.其中符號(hào)說(shuō)明如下:
    A   :   絕對(duì)地址,鏈接時(shí)不改變.
    B   :   符號(hào)位于bss數(shù)據(jù)段
    C   :   符號(hào)為common. common symbol是未初始化數(shù)據(jù)段(參考匯編文件中.common)
    D   :   已初始化數(shù)據(jù)段中的符號(hào)
    G   :   符號(hào)位于已初始化數(shù)據(jù)段中,重要用于small data object提高訪問(wèn)速度.
    I   :   該符號(hào)是對(duì)另一個(gè)符號(hào)的間接引用
    N   :   該符號(hào)是一個(gè)debugging符號(hào)
    R   :   只讀數(shù)據(jù)去符號(hào)(C語(yǔ)言中的const修飾)
    S   :   符號(hào)位于非初始化數(shù)據(jù)區(qū),用于small object
    T   :   符號(hào)位于text section
    U   :   符號(hào)未定義
    V   :   該符號(hào)是一個(gè)weak object
    W   :   弱符號(hào)
    ?   :   類型未定義




objcopy使用說(shuō)明

objcopy用于將object的部分或全部?jī)?nèi)容拷貝到另一個(gè)object,從而可以實(shí)現(xiàn)格式的變換。

objcopy可用用于將文件轉(zhuǎn)換成S-record格式或者raw二進(jìn)制格式。

例如,

         xxxx-elf-objcopy –O srec test.o test.s19

則將test.o轉(zhuǎn)換成s-record文件中。通常涉及到text段。

         xxxx-elf-objcopy –O binary test.o test.bin

則將test.o轉(zhuǎn)換成raw binary文件格式。

       當(dāng)將object文件轉(zhuǎn)換成raw binary格式時(shí),通常將去除掉symbols和relocation信息。在生成s-record過(guò)程中,有時(shí)需要用選項(xiàng)“-S”,“-R”去除掉binary文件,s-record文件不需要的相應(yīng)信息。

此外,還需要注意到使用objcopy不能夠改變大、小endian。

 

選項(xiàng)

Desc

infile/outfile

源文件/目標(biāo)文件

-I bfdname

--input-target=bfdname

輸入文件的bfdname,可取值elf32-little,elf32-big等,可用用objdump –I查看相應(yīng)的信息

-O bfdname

--output-target=bfdname

輸出文件的bfdname

-F bfdname

--target=bfdname

指定輸入、輸出文件的bfdname,目標(biāo)文件格式

-j sectionname

--only-section=sectionname

只將由sectionname指定的section拷貝到輸出文件

-R sectionname

--remove-section=sectionname

去除掉由sectionname指定的section

-S

--strip-all

去掉源文件的符號(hào)信息和relocation信息

-g

--strip-debug

去除掉調(diào)試符號(hào)信息和相關(guān)的段

-K symbolname

--keep-symbol=symbolname

保留由symbolname指定的符號(hào)信息

-N symbolname

--strip-symbol=symbolname

去除掉由symbolname指定的符號(hào)信息

-G symbolname

--keep-global-symbol=symbolname

-L symbolname

--localize-symbol=symbolname

-W symbolname

--weaken-symbol=symbolname

-w

--wildcard

-x

--discard-all

-X

--discard-locals

處理符號(hào)

-b byte

--byte=byte

每byteth byte中保留1 byte

-i interleave

--interleave=interleave

每隔interleave字節(jié)拷貝1 byte

--gap-fill val

在section中填充val

--set-start val

設(shè)定新文件的start address

--change-start incr

--adjust-start incr

調(diào)整start address

--change-address incr

--adjust-vma incr

調(diào)整所有sections的VMA(virtual memory address)和LMA(linear memory address)。

--change-section-address

        section{=,+,-}val

--adjust-section-vma section

       {=,+,-}val

調(diào)整指定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

添加一個(gè)section,該section的內(nèi)容為filenmae的內(nèi)容

--rename-section oldname=

    newname[,flags]

更改section的名

-V

--version

objcopy的version number


objdump命令的使用



objdump命令是Linux下的反匯編目標(biāo)文件或者可執(zhí)行文件的命令,它還有其他作用,下面以ELF格式可執(zhí)行文件test為例詳細(xì)介紹:


objdump -f test

顯示test的文件頭信息


objdump -d test

反匯編test中的需要執(zhí)行指令的那些section




objdump -D test

與-d類似,但反匯編test中的所有section



objdump -h test

顯示test的Section Header信息



objdump -x test

顯示test的全部Header信息




objdump -s test

除了顯示test的全部Header信息,還顯示他們對(duì)應(yīng)的十六進(jìn)制文件代碼




舉例:

將C源代碼和反匯編出來(lái)的指令對(duì)照:

1.

編譯成目標(biāo)文件(要加-g選項(xiàng))

gcc -g -o test.c


2.

輸出C源代碼和反匯編出來(lái)的指令對(duì)照的格式

objdump -S test.o

如下:




如何對(duì)任意一個(gè)二進(jìn)制文件進(jìn)行反匯編?

我們可以這樣做:

objdump -D -b binary -m i386 a.bin

-D表示對(duì)全部文件進(jìn)行反匯編,-b表示二進(jìn)制,-m表示指令集架構(gòu),a.bin就是我們要反匯編的二進(jìn)制文件


objdump -m可以查看更多支持的指令集架構(gòu),如i386:x86-64,i8086等


另外上面的所有objdump命令的參數(shù)同樣適用于arm-linux-objdump。


同時(shí)我們也可以指定big-endian或little-endian(-EB或-EL),我們可以指定從某一個(gè)位置開(kāi)始反匯編等。所以objdump命令是非常強(qiáng)大的!


readelf命令的使用  

readelf命令是Linux下的分析ELF文件的命令,這個(gè)命令在分析ELF文件格式時(shí)非常有用,下面以ELF格式可執(zhí)行文件test為例詳細(xì)介紹:


readelf -v

顯示版本


readelf -h

顯示幫助


readelf -a test

顯示test的全部信息



readelf -h test

顯示test的ELF Header的文件頭信息(就是ELF文件開(kāi)始的前52個(gè)字節(jié))


readelf -l test

顯示test的Program Header Table中的每個(gè)Prgram Header Entry的信息(如果有)



readelf -S test

顯示test的Section Header Table中的每個(gè)Section Header Entry的信息(如果有)



readelf -g test

顯示test的Section Group的信息(如果有)


readelf -s test

顯示test的Symbol Table中的每個(gè)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段信息(如果有)


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: OBJCPY OBJDUMP

技術(shù)專區(qū)

關(guān)閉