博客專欄

EEPW首頁 > 博客 > objcpy,objdump,readelf,nm

objcpy,objdump,readelf,nm

發(fā)布人:電子禪石 時間:2021-04-24 來源:工程師 發(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ù)制重定位和符號信息
    -K  :   保留某個符號
    -N  :   去掉某個符號
    -L  :   使某個符號local化
    -W  :   使某個符號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  :   顯示各個section的十六進(jìn)制碼以及對應(yīng)的ascii碼
    -m  :   CPU架構(gòu)
    -b  :   目標(biāo)文件格式,默認(rèn)elf32,可以指定為binary二進(jìn)制格式.

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


3. readelf 顯示目標(biāo)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 列出目標(biāo)文件中的符號
    -a  :   列出所有符號,包括debugger-only的符號.
    -A  :   顯示文件名
    -g  :   只顯示外部符號
    -C  :   將低級符號解碼(demangle)成用戶級名字,使C++函數(shù)名具有可讀性.
    -D  :   顯示Dynamic符號
    -u  :   僅顯示沒有定義的符號
    -r  :   反序顯示
    -n  :   按地址順序顯示

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




objcopy使用說明

objcopy用于將object的部分或全部內(nèi)容拷貝到另一個object,從而可以實現(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格式時,通常將去除掉symbols和relocation信息。在生成s-record過程中,有時需要用選項“-S”,“-R”去除掉binary文件,s-record文件不需要的相應(yīng)信息。

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

 

選項

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

去掉源文件的符號信息和relocation信息

-g

--strip-debug

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

-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字節(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

添加一個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信息,還顯示他們對應(yīng)的十六進(jìn)制文件代碼




舉例:

將C源代碼和反匯編出來的指令對照:

1.

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

gcc -g -o test.c


2.

輸出C源代碼和反匯編出來的指令對照的格式

objdump -S test.o

如下:




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

我們可以這樣做:

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

-D表示對全部文件進(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。


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


readelf命令的使用  

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


readelf -v

顯示版本


readelf -h

顯示幫助


readelf -a test

顯示test的全部信息



readelf -h test

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


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


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



關(guān)鍵詞: OBJCPY OBJDUMP

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

關(guān)閉