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)系工作人員刪除。