博客專欄

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

        objcpy,objdump,readelf,nm

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

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


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: OBJCPY OBJDUMP

        技術專區

        關閉
        主站蜘蛛池模板: 张掖市| 茶陵县| 涡阳县| 河西区| 阿尔山市| 抚宁县| 克山县| 喀什市| 绩溪县| 汶川县| 法库县| 广安市| 多伦县| 枣强县| 郑州市| 苏州市| 苏尼特左旗| 富宁县| 林芝县| 永宁县| 贵定县| 宣威市| 辉南县| 丽江市| 广东省| 九江市| 漾濞| 襄樊市| 阜南县| 汾阳市| 嵩明县| 昌邑市| 伊金霍洛旗| 普兰县| 大同县| 霞浦县| 卢氏县| 岗巴县| 沙田区| 卓资县| 泗洪县|