色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

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

          objcpy,objdump,readelf,nm

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

          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  :   反匯編目標文件中需要執(zhí)行指令的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++函數(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二進制格式。

          例如,

                   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文件格式。

                 當將object文件轉(zhuǎn)換成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

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

          -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

          設定新文件的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下的反匯編目標文件或者可執(zhí)行文件的命令,它還有其他作用,下面以ELF格式可執(zhí)行文件test為例詳細介紹:


          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信息,還顯示他們對應的十六進制文件代碼




          舉例:

          將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命令的參數(shù)同樣適用于arm-linux-objdump。


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


          readelf命令的使用  

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


          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ā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



          關鍵詞: OBJCPY OBJDUMP

          技術專區(qū)

          關閉