gcc的ar,nm,objdump,objcopy

OBJ文件格式分析工具: objdump, nm,ar


首先簡要闡述關於gcc、glibc和 binutils模塊之間的關係linux

1、關於gcc、glibc和binutils模塊之間的關係c++

一、gcc(gnu collect compiler)是一組編譯工具的總稱。它主要完成的工做任務是「預處理」和「編譯」,以及提供了與編譯器緊密相關的運行庫的支持,如 libgcc_s.so、libstdc++.so等。程序員

二、binutils提供了一系列用來建立、管理和維護二進制目標文件的工具程序,如彙編(as)、鏈接(ld)、靜態庫歸檔(ar)、反彙編 (objdump)elf結構分析工具(readelf)無效調試信息和符號的工具(strip)等。一般,binutils與gcc是緊密相集成 的,沒有binutils的話,gcc是不能正常工做的shell

三、glibc是gnu發佈的libc庫,也即c運行庫。glibc是linux系統中最底層的api(應用程序開發接口),幾乎其它任何的運行庫 都會倚賴於glibc。glibc除了封裝linux操做系統所提供的系統服務外,它自己也提供了許多其它一些必要功能服務的實現,主要的以下:
(1)string,字符串處理
(2)signal,信號處理
(3)dlfcn,管理共享庫的動態加載
(4)direct,文件目錄操做
(5)elf,共享庫的動態加載器,也即interpreter
(6)iconv,不一樣字符集的編碼轉換
(7)inet,socket接口的實現
(8)intl,國際化,也即gettext的實現
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虛擬終端設備的管理,及系統的安全訪問
(13)malloc,動態內存的分配與管理
(14)nis
編程

(15)stdlib,其它基本功能
 
api

2、redhat9上升級gccsass

一、升級這些庫時,最好不要覆蓋系統中缺省的;由於這些庫,尤爲是glibc庫,是系統中最核心的共享庫和工具,若是盲目覆蓋,極可能致使整個系統 癱瘓,由於通常更新glibc庫時,其它全部以來libc庫的共享庫都須要從新被編譯一遍。所以,爲了調試某個程序進入glibc時,最好把glibc安 裝到/usr/local/lib下。安全

二、首先編譯glibc庫。注意最好令創建一個glibc-build的目錄,configure時加上--enable-add- ons=linuxthreads選項。make install安裝到/usr/local下。架構

三、修改gcc的spec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld- linux.so.2爲/usr/local/lib下的新的共享庫裝載器。app

四、編譯binutils庫,此時被編譯出的程序會鏈接到/usr/local/lib下的新的libc庫。注意,在configure前,須要設 置ld缺省鏈接的路徑(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),不然binutils會 configure出錯,找不到libc中的一些符號。具體步驟以下:
(1)export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
(2)mkdir binutils-build && cd binutils-build
(3)../binutils-2.13.90.0.18/configure
(4)make
(5)make -C ld clean
(6)make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin(設置編譯後的ld的缺省庫搜索路徑,後面的比前面的優先級高)
(7)make install

 

3、總結

一、運行時,動態庫的裝載依賴於ld-linux.so.6的實現,它查找共享庫的順序以下:
(1)ld-linux.so.6在可執行的目標文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;當glibc安裝到/usr/local下時,它查找/usr/local /lib
(3)LD_LIBRARY_PATH環境變量中所設定的路徑
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路徑,由ldconfig生成二進制的 ld.so.cache中

二、編譯時,搜索庫的路徑順序以下:
(1)ld-linux.so.6由gcc的spec文件中所設定
(2)gcc --print-search-dirs所打印出的路徑,主要是libgcc_s.so等庫。能夠經過GCC_EXEC_PREFIX來設定
(3)LIBRARY_PATH環境變量中所設定的路徑,或編譯的命令行中指定的-L/usr/local/lib 
(2)binutils中的ld所設定的缺省搜索路徑順序,編譯binutils時指定。

     (能夠經過「ld --verbose | grep SEARCH」來查看)

三、二進制程序的搜索路徑順序爲PATH環境變量中所設定。通常/usr/local/bin高於/usr/bin

四、編譯時的頭文件的搜索路徑順序,與library的查找順序相似。通常/usr/local/include高於/usr/include

————————————————————————————————————

前言
若是普通編程不須要了解這些東西,若是想精確控制你的對象文件的格式或者你想查看一下文件對象裏的內容以便做出某種判斷,剛你能夠看一下下面的工 具:objdump, nm, ar。固然,本文不可能很是詳細的說明它們的使用方法和功能。若是你以爲本文不夠清楚,你可使用:man. 個人計劃只是想讓更多的人瞭解這些工具,之後在從此 的編程過程當中能有所幫助。


操做系統: Linux

開始

  • 庫文件操做命令:ar ----很是好的東東。。讓你能查看函數庫裏的詳細狀況和用多個對象文件生成一個庫文件。
    • 經 經常使用法:
      • ar -t libname.a //顯示全部對象文件(.o文件)的列表.例: # ar t libtest.a
        libtest1.o
        libtest2.o
      • ar -rv libname.a  objfile1.o objfile2.o ... objfilen.o  //把objfile1.o--objfilen.o打包成一個庫文件
    • ar 選項
      d:從庫中刪除模塊。按模塊原來的文件名指定要刪除的模塊。若是使用了任選項v則列出被刪除的每一個模塊。
      m:該操做是在一個庫中移動成員。當庫中若是有若干模塊有相同的符號定義(如函數定義),則成員的位置順序很重要。若是沒有指定任選項,任何指定的成員將 移到庫的最後。也可使用'a','b',或'I'任選項移動到指定的位置。
      p:顯示庫中指定的成員到標準輸出。若是指定任選項v,則在輸出成員的內容前,將顯示成員的名字。若是沒有指定成員的名字,全部庫中的文件將顯示出來。
      q:快速追加。增長新模塊到庫的結尾處。並不檢查是否須要替換。'a','b',或'I'任選項對此操做沒有影響,模塊老是追加的庫的結尾處。若是使用了 任選項v則列出每一個模塊。 這時,庫的符號表沒有更新,能夠用'ar s'或ranlib來更新庫的符號表索引。
      r:在庫中插入模塊(替換)。當插入的模塊名已經在庫中存在,則替換同名的模塊。若是若干模塊中有一個模塊在庫中不存在,ar顯示一個錯誤消息,並不替換 其餘同名模塊。默認的狀況下,新的成員增長在庫的結尾處,可使用其餘任選項來改變增長的位置。
      t:顯示庫的模塊表清單。通常只顯示模塊名。
      x:從庫中提取一個成員。若是不指定要提取的模塊,則提取庫中全部的模塊。
      下面在看看可與操做選項結合使用的任選項:

      a:在庫的一個已經存在的成員後面增長一個新的文件。若是使用任選項a,則應該爲命令行中membername參數指定一個已經存在的成員名。
      b:在庫的一個已經存在的成員前面增長一個新的文件。若是使用任選項b,則應該爲命令行中membername參數指定一個已經存在的成員名。
      c:建立一個庫。無論庫是否存在,都將建立。
      f:在庫中截短指定的名字。缺省狀況下,文件名的長度是不受限制的,可使用此參數將文件名截短,以保證與其它系統的兼容。
      i:在庫的一個已經存在的成員前面增長一個新的文件。若是使用任選項i,則應該爲命令行中membername參數指定一個已經存在的成員名(相似任選項 b)。
      l:暫未使用
      N:與count參數一塊兒使用,在庫中有多個相同的文件名時指定提取或輸出的個數。
      o:當提取成員時,保留成員的原始數據。若是不指定該任選項,則提取出的模塊的時間將標爲提取出的時間。
      P:進行文件名匹配時使用全路徑名。ar在建立庫時不能使用全路徑名(這樣的庫文件不符合POSIX標準),可是有些工具能夠。
      s:寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。甚至對於沒有任何變化的庫也做該動做。對一個庫作ar s等同於對該庫作ranlib。
      S:不建立目標文件索引,這在建立較大的庫時能加快時間。
      u:通常說來,命令ar r...插入全部列出的文件到庫中,若是你只想插入列出文件中那些比庫中同名文件新的文件,就可使用該任選項。該任選項只用於r操做選項。
      v:該選項用來顯示執行操做選項的附加信息。
      V:顯示ar的版本.
  • nm --列出目標文件(.o)的符號清單。。NND,太激動了。剛知道此命令時讓我三天沒睡好覺。我就使勁用了一把。
    • 經常使用法:
      • nm -s filename.a/filename.o/a.out  裏邊全部的符號列表一清二楚。例:
        # nm -s a.out
        080495b8 A __bss_start
        08048334 t call_gmon_start
        080495b8 b completed.5751
        080494b8 d __CTOR_END__
        080494b4 d __CTOR_LIST__
        080495ac D __data_start
        080495ac W data_start
        08048450 t __do_global_ctors_aux
        08048360 t __do_global_dtors_aux
        080495b0 D __dso_handle
        080494c0 d __DTOR_END__
        080494bc d __DTOR_LIST__
        080494c8 d _DYNAMIC
        080495b8 A _edata
        080495bc A _end
        0804847c T _fini
        08048498 R _fp_hw
        08048390 t frame_dummy
        080484b0 r __FRAME_END__
        08049594 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
        0804844c T __i686.get_pc_thunk.bx
        080482b8 T _init
        080494b4 a __init_array_end
        080494b4 a __init_array_start
        0804849c R _IO_stdin_used
        080494c4 d __JCR_END__
        080494c4 d __JCR_LIST__
                 w _Jv_RegisterClasses
        080483e0 T __libc_csu_fini
        080483f0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.0
        080483b4 T main
        080495b4 d p.5749
                 U puts@@GLIBC_2.0
        08048310 T _start
    • 選項/屬性:
      -a或--debug-syms:顯示調試符號。
      -B:等同於--format=bsd,用來兼容MIPS的nm。
      -C或--demangle:將低級符號名解碼(demangle)成用戶級名字。這樣可使得C++函數名具備可讀性。
      -D或--dynamic:顯示動態符號。該任選項僅對於動態目標(例如特定類型的共享庫)有意義。
      -f format:使用format格式輸出。format能夠選取bsd、sysv或posix,該選項在GNU的nm中有用。默認爲bsd。
      -g或--extern-only:僅顯示外部符號。
      -n、-v或--numeric-sort:按符號對應地址的順序排序,而非按符號名的字符順序。
      -p或--no-sort:按目標文件中遇到的符號順序顯示,不排序。
      -P或--portability:使用POSIX.2標準輸出格式代替默認的輸出格式。等同於使用任選項-f posix。
      -s或--print-armap:當列出庫中成員的符號時,包含索引。索引的內容包含:哪些模塊包含哪些名字的映射。
      -r或--reverse-sort:反轉排序的順序(例如,升序變爲降序)。
      --size-sort:按大小排列符號順序。該大小是按照一個符號的值與它下一個符號的值進行計算的。
      -t radix或--radix=radix:使用radix進制顯示符號值。radix只能爲"d"表示十進制、"o"表示八進制或"x"表示十六進制。
      --target=bfdname:指定一個目標代碼的格式,而非使用系統的默認格式。
      -u或--undefined-only:僅顯示沒有定義的符號(那些外部符號)。
      -l或--line-numbers:對每一個符號,使用調試信息來試圖找到文件名和行號。對於已定義的符號,查找符號地址的行號。對於未定義符號,查找指 向符號重定位入口的行號。若是能夠找到行號信息,顯示在符號信息以後。
      -V或--version:顯示nm的版本號。
      --help:顯示nm的任選項。
  • objdump  文件命令功能強的驚人。能實現上述兩個命令(ar,nm)的 不少功能。它主要是查看對象文件的內容信息。
    • 經常使用法:
      • objdump -h file<.o,.a,.out>//查看對象文件全部的節sections.例如:
        # objdump -h libtest1.o
        libtest1.o:     file format elf32-i386
        Sections:
        Idx Name          Size      VMA       LMA       File off  Algn
          0 .text         00000014  00000000  00000000  00000034  2**2
                          CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
          1 .data         00000000  00000000  00000000  00000048  2**2
                          CONTENTS, ALLOC, LOAD, DATA
          2 .bss          00000000  00000000  00000000  00000048  2**2
                          ALLOC
          3 .rodata       0000000e  00000000  00000000  00000048  2**0
                          CONTENTS, ALLOC, LOAD, READONLY, DATA
          4 .comment      0000001f  00000000  00000000  00000056  2**0
                          CONTENTS, READONLY
          5 .note.GNU-stack 00000000  00000000  00000000  00000075  2**0
                          CONTENTS, READONLY
      • objdump -t 查看對象文件全部的符號列表,至關於 nm -s objfilename,如:
        # objdump -t libtest1.o

        libtest1.o:     file format elf32-i386

        SYMBOL TABLE:
        00000000 l    df *ABS*  00000000 libtest1.c
        00000000 l    d  .text  00000000 .text
        00000000 l    d  .data  00000000 .data
        00000000 l    d  .bss   00000000 .bss
        00000000 l    d  .rodata        00000000 .rodata
        00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack
        00000000 l    d  .comment       00000000 .comment
        00000000 g     F .text  00000014 print_test1
        00000000         *UND*  00000000 puts
    • 更多信息請查看選項:
      --archive-headers
      -a 顯示檔案庫的成員信息,與 ar tv 相似

          objdump -a libpcap.a
          和 ar -tv libpcap.a 顯示結果比較比較
          顯然這個選項沒有什麼意思。

      --adjust-vma=offset
          When  dumping  information, first add offset to all
          the section addresses.  This is useful if the  sec-
          tion  addresses  do  not correspond  to the symbol
          table, which can happen when  putting  sections  at
          particular  addresses when using a format which can
          not represent section addresses, such as a.out.

      -b bfdname
      --target=bfdname
          指定目標碼格式。這不是必須的,objdump能自動識別許多格式,
          好比:objdump -b oasys -m vax -h fu.o
          顯示fu.o的頭部摘要信息,明確指出該文件是Vax系統下用Oasys
          編譯器生成的目標文件。objdump -i將給出這裏能夠指定的
          目標碼格式列表

      --demangle
      -C 將底層的符號名解碼成用戶級名字,除了去掉全部開頭
         的下劃線以外,還使得C++函數名以可理解的方式顯示出來。

      --debugging 
          顯示調試信息。企圖解析保存在文件中的調試信息並以C語言
          的語法顯示出來。僅僅支持某些類型的調試信息。

      --disassemble
      -d 反彙編那些應該還有指令機器碼的section

      --disassemble-all
      -D 與 -d 相似,但反彙編全部section

      --prefix-addresses
          反彙編的時候,顯示每一行的完整地址。這是一種比較老的反彙編格式。
          顯示效果並不理想,但可能會用到其中的某些顯示,本身能夠對比。

      --disassemble-zeroes
          通常反彙編輸出將省略大塊的零,該選項使得這些零塊也被反彙編。

      -EB
      -EL
      --endian={big|little}
          這個選項將影響反彙編出來的指令。
          little-endian就是咱們當年在dos下玩彙編的時候常說的高位在高地址,
          x86都是這種。

      --file-headers
      -f 顯示objfile中每一個文件的總體頭部摘要信息。

      --section-headers
      --headers
      -h 顯示目標文件各個section的頭部摘要信息。

      --help 簡短的幫助信息。

      --info
      -i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表。

      --section=name
      -j name 僅僅顯示指定section的信息

      --line-numbers
      -l 用文件名和行號標註相應的目標代碼,僅僅和-d、-D或者-r一塊兒使用
         使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求
         編譯時使用了-g之類的調試編譯選項。

      --architecture=machine
      -m machine
          指定反彙編目標文件時使用的架構,當待反彙編文件自己沒有描述
          架構信息的時候(好比S-records),這個選項頗有用。能夠用-i選項
          列出這裏可以指定的架構

      --reloc
      -r 顯示文件的重定位入口。若是和-d或者-D一塊兒使用,重定位部分以反匯
         編後的格式顯示出來。

      --dynamic-reloc
      -R 顯示文件的動態重定位入口,僅僅對於動態目標文件有意義,好比某些
         共享庫。

      --full-contents
      -s 顯示指定section的完整內容。

          objdump --section=.text -s inet.o | more

      --source
      -S 儘量反彙編出源代碼,尤爲當編譯的時候指定了-g這種調試參數時,
         效果比較明顯。隱含了-d參數。

      --show-raw-insn
          反彙編的時候,顯示每條彙編指令對應的機器碼,除非指定了
          --prefix-addresses,這將是缺省選項。

      --no-show-raw-insn
          反彙編時,不顯示彙編指令的機器碼,這是指定 --prefix-addresses
          選項時的缺省設置。

      --stabs
          Display the contents of the .stab, .stab.index, and
          .stab.excl sections from an ELF file.  This is only
          useful  on  systems  (such as Solaris 2.0) in which
          .stab debugging symbol-table entries are carried in
          an ELF section.  In most other file formats, debug-
          ging  symbol-table  entries  are interleaved  with
          linkage symbols, and are visible in the --syms output.

      --start-address=address
          從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出。

      --stop-address=address
          顯示數據直到指定地址爲止,該選項影響-d、-r和-s選項的輸出。

      --syms
      -t 顯示文件的符號表入口。相似於nm -s提供的信息

      --dynamic-syms
      -T 顯示文件的動態符號表入口,僅僅對動態目標文件有意義,好比某些
         共享庫。它顯示的信息相似於 nm -D|--dynamic 顯示的信息。

      --version 版本信息

          objdump --version

      --all-headers
      -x 顯示全部可用的頭信息,包括符號表、重定位入口。-x 等價於
         -a -f -h -r -t 同時指定。

          objdump -x inet.o




ar,nm,objdump,objcopy
  

From: http://blog.163.com/tao198352__4232/blog/static/85020645201081993325589/

若是普通編程不須要了解這些東西,若是想精確控制你的目標文件的格式或者你想查看一下文件裏的內容以便做出某種判斷,那麼你能夠看一下下面的工具:ar,nm,objdump,objcopy。具體用法請參考man在線手冊。


ar基本用法


    ar命令能夠用來建立、修改庫,也能夠從庫中提出單個模塊。庫是一單獨的文件,裏面包含了按照特定的結構組織起來的其它的一些文件(稱作此庫文件的member)。原始文件的內容、模式、時間戳、屬主、組等屬性都保留在庫文件中。

  下面是ar命令的格式:

  ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...

  例如咱們能夠用ar rv libtest.a hello.o hello1.o 來 生成一個庫,庫名字是test,連接時能夠用-ltest連接。該庫中存放了兩個模塊hello.o和hello1.o。選項前能夠有‘-'字符,也能夠 沒有。下面咱們來看看命令的操做選項和任選項。如今咱們把{dmpqrtx}部分稱爲操做選項,而[abcfilNoPsSuvV]部分稱爲任選項。

  {dmpqrtx}中的操做選項在命令中只能而且必須使用其中一個,它們的含義以下:

  • d:從庫中刪除模塊。按模塊原來的文件名指定要刪除的模塊。若是使用了任選項v則列出被刪除的每一個模塊。
  • m:該操做是在一個庫中移動成員。當庫中若是有若干模塊有相同的符號定義(如函數定義),則成員的位置順序很重要。若是沒有指定任選項,任何指定的成員將移到庫的最後。也可使用'a','b',或'I'任選項移動到指定的位置。
  • p:顯示庫中指定的成員到標準輸出。若是指定任選項v,則在輸出成員的內容前,將顯示成員的名字。若是沒有指定成員的名字,全部庫中的文件將顯示出來。
  • q:快速追加。增長新模塊到庫的結尾處。並不檢查是否須要替換。'a','b',或'I'任選項對此操做沒有影響,模塊老是追加的庫的結尾處。若是使用了任選項v則列出每一個模塊。 這時,庫的符號表沒有更新,能夠用'ar s'或ranlib來更新庫的符號表索引。
  • r:在庫中插入模塊(替換)。當插入的模塊名已經在庫中存在,則替換同名的模塊。若是若干模塊中有一個模塊在庫中不存在,ar顯示一個錯誤消息,並不替換其餘同名模塊。默認的狀況下,新的成員增長在庫的結尾處,可使用其餘任選項來改變增長的位置。
  • t:顯示庫的模塊表清單。通常只顯示模塊名。
  • x:從庫中提取一個成員。若是不指定要提取的模塊,則提取庫中全部的模塊。

  下面在看看可與操做選項結合使用的任選項:

  • a:在庫的一個已經存在的成員後面增長一個新的文件。若是使用任選項a,則應該爲命令行中membername參數指定一個已經存在的成員名。
  • b:在庫的一個已經存在的成員前面增長一個新的文件。若是使用任選項b,則應該爲命令行中membername參數指定一個已經存在的成員名。
  • c:建立一個庫。無論庫是否存在,都將建立。
  • f:在庫中截短指定的名字。缺省狀況下,文件名的長度是不受限制的,可使用此參數將文件名截短,以保證與其它系統的兼容。
  • i:在庫的一個已經存在的成員前面增長一個新的文件。若是使用任選項i,則應該爲命令行中membername參數指定一個已經存在的成員名(相似任選項b)。
  • l:暫未使用
  • N:與count參數一塊兒使用,在庫中有多個相同的文件名時指定提取或輸出的個數。
  • o:當提取成員時,保留成員的原始數據。若是不指定該任選項,則提取出的模塊的時間將標爲提取出的時間。
  • P:進行文件名匹配時使用全路徑名。ar在建立庫時不能使用全路徑名(這樣的庫文件不符合POSIX標準),可是有些工具能夠。
  • s:寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。甚至對於沒有任何變化的庫也做該動做。對一個庫作ar s等同於對該庫作ranlib。
  • S:不建立目標文件索引,這在建立較大的庫時能加快時間。
  • u:通常說來,命令ar r...插入全部列出的文件到庫中,若是你只想插入列出文件中那些比庫中同名文件新的文件,就可使用該任選項。該任選項只用於r操做選項。
  • v:該選項用來顯示執行操做選項的附加信息。
  • V:顯示ar的版本。

nm基本用法

   nm用來列出目標文件的符號清單。下面是nm命令的格式:

  nm [-a│--debug-syms] [-g│--extern-only]
          [-B] [-C│--demangle[=style]] [-D│--dynamic]
          [-S│--print-size] [-s│--print-armap]
          [-A│-o│--print-file-name][--special-syms]
          [-n│-v│--numeric-sort] [-p│--no-sort]
          [-r│--reverse-sort] [--size-sort] [-u│--undefined-only]
          [-t radix│--radix=radix] [-P│--portability]
          [--target=bfdname] [-f format│--format=format]
          [--defined-only] [-l│--line-numbers] [--no-demangle]
          [-V│--version] [-X 32_64] [--help]  [objfile...]

  若是沒有爲nm命令指出目標文件,則nm假定目標文件是a.out。下面列出該命令的任選項,大部分支持"-"開頭的短格式和"—"開頭的長格式。

  • -A、-o或--print-file-name:在找到的各個符號的名字前加上文件名,而不是在此文件的全部符號前只出現文件名一次。

    例如nm libtest.a的輸出以下:

    CPThread.o:
    00000068 T Main__8CPThreadPv
    00000038 T Start__8CPThread
    00000014 T _._8CPThread
    00000000 T __8CPThread
    00000000 ? __FRAME_BEGIN__
    .......................................

    則nm -A 的輸出以下:

    libtest.a:CPThread.o:00000068 T Main__8CPThreadPv
    libtest.a:CPThread.o:00000038 T Start__8CPThread
    libtest.a:CPThread.o:00000014 T _._8CPThread
    libtest.a:CPThread.o:00000000 T __8CPThread
    libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__
    ..................................................................
  • -a或--debug-syms:顯示全部的符號,包括debugger-only symbols 
  • -B:等同於--format=bsd,用來兼容MIPS的nm。
  • -C或--demangle:將低級符號名解析(demangle)成用戶級名字。這樣可使得C++函數名具備可讀性。
  • --no-demangle:默認的選項,不須要將低級符號名解析成用戶級名 
  • -D或--dynamic:顯示動態符號。該任選項僅對於動態目標(例如特定類型的共享庫)有意義。
  • -f format:使用format格式輸出。format能夠選取bsd、sysv或posix,該選項在GNU的nm中有用。默認爲bsd。
  • -g或--extern-only:僅顯示外部符號。
  • -n、-v或--numeric-sort:按符號對應地址的順序排序,而非按符號名的字符順序。
  • -p或--no-sort:按目標文件中遇到的符號順序顯示,不排序。
  • -P或--portability:使用POSIX.2標準輸出格式代替默認的輸出格式。等同於使用任選項-f posix。
  • -s或--print-armap:當列出庫中成員的符號時,包含索引。索引的內容包含:哪些模塊包含哪些名字的映射。
  • -r或--reverse-sort:反轉排序的順序(例如,升序變爲降序)。
  • --size-sort:按大小排列符號順序。該大小是按照一個符號的值與它下一個符號的值進行計算的。
  • -t radix或--radix=radix:使用radix進制顯示符號值。radix只能爲"d"表示十進制、"o"表示八進制或"x"表示十六進制。
  • --target=bfdname:指定一個目標代碼的格式,而非使用系統的默認格式。
  • -u或--undefined-only:僅顯示沒有定義的符號(那些外部符號)。
  • --defined-only:僅顯示定義的符號。
  • -l或--line-numbers:對每一個符號,使用調試信息來試圖找到文件名和行號。對於已定義的符號,查找符號地址的行號。對於未定義符號,查找符號重定位項的行號。若是能夠找到行號信息,顯示在符號信息以後。
  • -V或--version:顯示nm的版本號。
  • --help:顯示nm的任選項。

   對於每個符號,nm列出其值(the symbol value),類型(the symbol type)和其名字(the symbol name)。

   對於每個符號來講,其類型若是是小寫的,則代表該符號是 local 的;大寫則代表該符號是 global(external) 的。
符號
類型
說明
A
該符號的值是絕對的,在之後的連接過程當中,不容許進行改變。這樣的符號值,經常出如今中斷向量表中,例如用符號來表示各個中斷向量函數在中斷向量表中的位置。
B
該符號的值出如今非初始化數據段  (bss)  中。例如,在一個文件中定義全局  static int test  。則該符號  test  的類型爲  b  ,位於  bss section  中。其值表示該符號在  bss  段中的偏移。通常而言,  bss  段分配於  RAM 
C
該符號爲  common    common symbol  是未初始話數據段。該符號沒有包含於一個普通  section  中。只有在連接過程當中才進行分配。符號的值表示該符號須要的字節數。例如在一個  c  文件中,定義  int test  ,而且該符號在別的地方會被引用,則該符號類型即爲  C  。不然其類型爲  B 
D
該符號位於初始話數據段中。通常來講,分配到  data section  中。例如定義全局  int baud_table[5] = {9600, 19200, 38400, 57600, 115200}  ,則會分配於初始化數據段中 
G
該符號也位於初始化數據段中。主要用於  small object  提升訪問  small data object  的一種方式。
I
該符號是對另外一個符號的間接引用。
N
該符號是一個  debugging  符號。
R
該符號位於只讀數據區。例如定義全局  const int test[] = {123, 123};    test  就是一個只讀數據區的符號。注意在  cygwin  下若是使用  gcc  直接編譯成  MZ  格式時,源文件中的  test  對應  _test  ,而且其符號類型爲  D  ,即初始化數據段中。可是若是使用  m6812-elf-gcc  這樣的交叉編譯工具,源文件中的  test  對應目標文件的  test,  即沒有添加下劃線,而且其符號類型爲  R  。通常而言,位於  rodata section  。值得注意的是,若是在一個函數中定義  const char *test = 「abc」, const char test_int = 3  。使用  nm  都不會獲得符號信息,可是字符串「  abc  」分配於只讀存儲器中,  test    rodata section  中,大小爲  4 
S
符號位於非初始化數據區,用於  small object 
T
該符號位於代碼區  text section 
U
該符號在當前文件中是未定義的,即該符號的定義在別的文件中。例如,當前文件調用另外一個文件中定義的函數,在這個被調用的函數在當前就是未定義的;可是在定義它的文件中類型是  T  。可是對於全局變量來講,在定義它的文件中,其符號類型爲  C  ,在使用它的文件中,其類型爲  U 
V
該符號是一個  weak object 
W
The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-
該符號是  a.out  格式文件中的  stabs symbol 
?
該符號類型沒有定義

objdump基本用法

   objdump有點象那個快速查看之流的工具,就是以一種可閱讀的格式讓你更多地瞭解二進制文件可能帶有的附加信息。對於通常只想讓本身程序跑起來的程序 員,這個命令沒有更多意義,對於想進一步瞭解系統的程序員,應該掌握這種工具,至少你能夠本身寫寫shellcode了,或者看看人家給的exploit 中的shellcode是什麼東西。更多關於目標文件的內容分析建議看看《深刻理解計算機》這本書的第二部分第七章節  
經常使用法:

objdump [-a│--archive-headers]
        [-b bfdname│--target=bfdname]
        [-C│--demangle[=style] ]
        [-d│--disassemble]
        [-D│--disassemble-all]
        [-z│--disassemble-zeroes]
        [-EB│-EL│--endian={big │ little }]
        [-f│--file-headers]
        [--file-start-context]
        [-g│--debugging]
        [-e│--debugging-tags]
        [-h│--section-headers│--headers]
        [-i│--info]
        [-j section│--section=section]
        [-l│--line-numbers]
        [-S│--source]
        [-m machine│--architecture=machine]
        [-M options│--disassembler-options=options]
        [-p│--private-headers]
        [-r│--reloc]
        [-R│--dynamic-reloc]
        [-s│--full-contents]
        [-W│--dwarf]
        [-G│--stabs]
        [-t│--syms]
        [-T│--dynamic-syms]
        [-x│--all-headers]
        [-w│--wide]
        [--start-address=address]
        [--stop-address=address]
        [--prefix-addresses]
        [--[no-]show-raw-insn]
        [--adjust-vma=offset]
        [--special-syms]
        [-V│--version]
        [-H│--help]
        objfile...
選項詳解:
--archive-headers
-a 顯示檔案庫的成員信息,與 ar tv 相似

  objdump -a libpcap.a
  和 ar -tv libpcap.a 顯示結果比較比較
  顯然這個選項沒有什麼意思。

--adjust-vma=offset
  When dumping information, first add offset to all
  the section addresses. This is useful if the sec-
  tion addresses do not correspond to the symbol
  table, which can happen when putting sections at
  particular addresses when using a format which can
  not represent section addresses, such as a.out.

-b bfdname
--target=bfdname
  指定目標碼格式。這不是必須的,objdump能自動識別許多格式,
  好比:objdump -b oasys -m vax -h fu.o
  顯示fu.o的頭部摘要信息,明確指出該文件是Vax系統下用Oasys
  編譯器生成的目標文件。objdump -i將給出這裏能夠指定的
  目標碼格式列表

--demangle
-C 將底層的符號名解碼成用戶級名字,除了去掉全部開頭
  的下劃線以外,還使得C++函數名以可理解的方式顯示出來。

--debugging 
  顯示調試信息。企圖解析保存在文件中的調試信息並以C語言
  的語法顯示出來。僅僅支持某些類型的調試信息。

--disassemble
-d 反彙編那些含有指令機器碼的section

--disassemble-all
-D 與 -d 相似,但反彙編全部section

--prefix-addresses
  反彙編的時候,顯示每一行的完整地址。這是一種比較老的反彙編格式。
  顯示效果並不理想,但可能會用到其中的某些顯示,本身能夠對比。

--disassemble-zeroes
  通常反彙編輸出將省略大塊的零,該選項使得這些零塊也被反彙編。

-EB
-EL
--endian={big|little}
  這個選項將影響反彙編出來的指令。
  little-endian就是咱們當年在dos下玩彙編的時候常說的高位在高地址,
  x86都是這種。

--file-headers
-f 顯示objfile中每一個文件的總體頭部摘要信息。

--section-headers
--headers
-h 顯示目標文件各個section的頭部摘要信息。

--help 簡短的幫助信息。

--info
-i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表。

--section=name
-j name 僅僅顯示指定section的信息

--line-numbers
-l 用文件名和行號標註相應的目標代碼,僅僅和-d、-D或者-r一塊兒使用
  使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求
  編譯時使用了-g之類的調試編譯選項。

--architecture=machine
-m machine
  指定反彙編目標文件時使用的架構,當待反彙編文件自己沒有描述
  架構信息的時候(好比S-records),這個選項頗有用。能夠用-i選項
  列出這裏可以指定的架構

--reloc
-r 顯示文件的重定位入口。若是和-d或者-D一塊兒使用,重定位部分以反匯
  編後的格式顯示出來。

--dynamic-reloc
-R 顯示文件的動態重定位入口,僅僅對於動態目標文件有意義,好比某些
  共享庫。

--full-contents
-s 顯示指定section的完整內容。

  objdump --section=.text -s inet.o | more

--source
-S 儘量反彙編出源代碼,尤爲當編譯的時候指定了-g這種調試參數時,
  效果比較明顯。隱含了-d參數。

--show-raw-insn
  反彙編的時候,顯示每條彙編指令對應的機器碼,除非指定了
  --prefix-addresses,這將是缺省選項。

--no-show-raw-insn
  反彙編時,不顯示彙編指令的機器碼,這是指定 --prefix-addresses
  選項時的缺省設置。

--stabs
  Display the contents of the .stab, .stab.index, and
  .stab.excl sections from an ELF file. This is only
  useful on systems (such as Solaris 2.0) in which
  .stab debugging symbol-table entries are carried in
  an ELF section. In most other file formats, debug-
  ging symbol-table entries are interleaved with
  linkage symbols, and are visible in the --syms output.

--start-address=address
  從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出。

--stop-address=address
  顯示數據直到指定地址爲止,該選項影響-d、-r和-s選項的輸出。

--syms
-t 顯示文件的符號表入口。相似於nm提供的信息

--dynamic-syms
-T 顯示文件的動態符號表入口,僅僅對動態目標文件有意義,好比某些
  共享庫。它顯示的信息相似於 nm -D|--dynamic 顯示的信息。

--version 版本信息

  objdump --version

--all-headers
-x 顯示全部可用的頭信息,包括符號表、重定位入口。-x 等價於
  -a -f -h -r -t 同時指定。

  objdump -x inet.o



objcopy 基本用法

objcopy把一種目標文件中的內容複製到另外一種類型的目標文件中. 

(1)將圖像編譯到可執行文件內 
Q: 如何將一個二進制文件,好比圖片,詞典一類的東西作爲.o文件,直接連接到可執行文件內部呢? 
A: 
$ objcopy -I binary -O elf32-i386 -B i386 14_95_13.jpg image.o 
$ gcc image.o tt.o -o tt 
$ nm tt | grep 14_95 
0805d6c7 D _binary_14_95_13_jpg_end 
00014213 A _binary_14_95_13_jpg_size 
080494b4 D _binary_14_95_13_jpg_start 

(2)使用objcopy把不用的信息去掉: 
$ objcopy -R .comment -R .note halo halo.min 

(3) 
$ objcopy -R .note -R .comment -S -O binary xyb xyb.bin 
-R .note -R .comment 表示移掉 .note 與 .comment 段 
-S 表示移出全部的標誌及重定位信息 
-O binary xyb xyb.bin 表示由xyb生成二進制文件xyb.bin 
objcopy工具使用指南
objcopy Utility
objcopy [ -F bfdname | --target=bfdname ]
[ -I bfdname | --input-target=bfdname ]
[ -O bfdname | --output-target= bfdname ]
[ -S | --strip-all ] [ -g | --strip-debug ]
[ -K symbolname | --keep-symbol= symbolname ]
[ -N symbolname | --strip-symbol= symbolname ]
[ -L symbolname | --localize-symbol= symbolname ]
[ -W symbolname | --weaken-symbol= symbolname ]
[ -x | --discard-all ] [ -X | --discard-locals ]
[ -b byte | --byte= byte ]
[ -i interleave | --interleave= interleave ]
[ -R sectionname | --remove-section= sectionname ]
[ -p | --preserve-dates ] [ --debugging ]
[ --gap-fill= val ] [ --pad-to= address ]
[ --set-start= val ] [ --adjust-start= incr ]
[ --change-address= incr ]
[ --change-section-address= section{=,+,-} val ]
[ --change-warnings ] [ --no-change-warnings ]
[ --set-section-flags= section= flags ]
[ --add-section= sectionname= filename ]
[ --change-leading char ] [--remove-leading-char ]
[ --weaken ]
[ -v | --verbose ] [ -V | --version ] [ --help ]
input-file [ outfile ]  
GNU 實用工具程序objcopy的做用是拷貝一個目標文件的內容到另外一個目標文件中。Objcopy使用GNU BFD庫去讀或寫目標文件。Objcopy可使用不一樣於源目標文件的格式來寫目的目標文件(也便是說能夠將一種格式的目標文件轉換成另外一種格式的目標文 件)。經過以上命令行選項能夠控制Objcopy的具體操做。
Objcopy在進行目標文件的轉換時,將生成一個臨時文件,轉換完成後就將這個臨 時文件刪掉。Objcopy使用BFD作轉換工做。若是沒有明確地格式要求,則Objcopy將訪問全部在BFD庫中已經描述了的而且它能夠識別的格式, 請參見《GNUpro Decelopment Tools》中「using ld」一章中「BFD庫」部分和「BFD庫中規範的目標文件格式」部分。
經過使用srec做爲輸出目標(使用命令行選項-o srec),Objcopy能夠產生S記錄格式文件。
通 過使用binary做爲輸出目標(使用命令行選項-o binary),Objcopy能夠產生原始的二進制文件。使用Objcopy產生一個原始的二進制文件,實質上是進行了一回輸入目標文件內容的內存轉 儲。全部的符號和重定位信息都將被丟棄。內存轉儲起始於輸入目標文件中那些將要拷貝到輸出目標文件去的部分的最小虛地址處。
使用Objcopy生成S記錄格式文件或者原始的二進制文件的過程當中,-S選項和-R選項可能會比較有用。-S選項是用來刪掉包含調試信息的部分,-R選項是用來刪掉包含了二進制文件不須要的內容的那些部分。
input-file
outfile
參 數input-file和outfile分別表示輸入目標文件(源目標文件)和輸出目標文件(目的目標文件)。若是在命令行中沒有明確地指定 outfile,那麼Objcopy將建立一個臨時文件來存放目標結果,而後使用input-file的名字來重命名這個臨時文件(這時候,原來的 input-file將被覆蓋)。
-I bfdname 
--input-target=bfdname
明確告訴Objcopy,源文件的格式是什麼,bfdname是BFD庫中描述的標準格式名。這樣作要比「讓Objcopy本身去分析源文件的格式,而後去和BFD中描述的各類格式比較,經過而得知源文件的目標格式名」的方法要高效得多。
-O bfdname 
--output-target= bfdname
使用指定的格式來寫輸出文件(即目標文件),bfdname是BFD庫中描述的標準格式名。
-F bfdname
--target= bfdname
明確告訴Objcopy,源文件的格式是什麼,同時也使用這個格式來寫輸出文件(即目標文件),也就是說將源目標文件中的內容拷貝到目的目標文件的過程當中,只進行拷貝不作格式轉換,源目標文件是什麼格式,目的目標文件就是什麼格式。
-R sectionname
--remove-section= sectionname
從輸出文件中刪掉全部名爲sectionname的段。這個選項能夠屢次使用。
注意:不恰當地使用這個選項可能會致使輸出文件不可用。
-S
--strip-all (strip 剝去、剝)
不從源文件中拷貝重定位信息和符號信息到輸出文件(目的文件)中去。
-g
--strip-debug
不從源文件中拷貝調試符號到輸出文件(目的文件)中去。
--strip-undeeded
剝去全部在重定位處理時所不須要的符號。
-K symbolname
--keep-symbol= symbolname
僅從源文件中拷貝名爲symbolname的符號。這個選項能夠屢次使用。
-N symbolname
--strip-symbol= symbolname
不從源文件中拷貝名爲symbolname的符號。這個選項能夠屢次使用。它能夠和其餘的strip選項聯合起來使用(除了-K symbolname | --keep-symbol= symbolname外)。
-L symbolname
--localize-symbol= symbolname
使名爲symbolname的符號在文件內局部化,以便該符號在該文件外部是不可見的。這個選項能夠屢次使用。
-W symbolname
-weaken-symbol= symbolname
弱化名爲symbolname的符號。這個選項能夠屢次使用。
-x
--discard-all (discard 丟棄、拋棄)
不從源文件中拷貝非全局符號。
-X
--discard-locals
不從源文件中拷貝又編譯器生成的局部符號(這些符號一般是L或 . 開頭的)。
-b byte
--byte= byte 
Keep only every byte th byte of the input file (header data is not affected). byte can be
in the range from 0 to interleave-1, where interleave is given by the -i or
--interleave option, or the default of 4. This option is useful for creating files to
program ROM . It is typically used with an srec output target.
-i interleave
--interleave= interleave (interleave 隔行、交叉)
Only copy one out of every interleave bytes. Select which byte to copy with the
-b or --byte option. The default is 4. objcopy ignores this option if you do not
specify either -b or --byte.
-p
--preserve-dates (preserve 保存、保持)
設置輸出文件的訪問和修改日期和輸入文件相同。
[ --debugging ]
若是可能的話,轉換調試信息。由於只有特定的調試格式被支持,以及這個轉換過程要耗費必定的時間,因此這個選項不是默認的。
--gap-fill= val
使用內容val填充段與段之間的空隙。經過增長段的大小,在地址較低的一段附加空間中填充內容val來完成這一選項的功能。
--pad-to= address
填 充輸出文件到虛擬地址address。經過增長輸出文件中最後一個段的大小,在輸出文件中最後一段的末尾和address之間的這段附加空間中,用 --gap-fill= val選項中指定的內容val來填充(默認內容是0,即沒有使用--gap-fill= val選項的狀況下)。
--set-start= val
設置新文件(應該是輸出文件吧?)的起始地址爲val。不是全部的目標文件格式都支持設置起始地址。
--change-start = incr
--adjust-start= incr
經過增長值incr來改變起始地址。不是全部的目標文件格式都支持設置起始地址。
--change-addresses incr
--adjust-vma incr
Change the VMA and LMA addresses of all sections, section., as well as the
start address, by adding incr. Some object file formats do not permit section
addresses to be changed arbitrarily.
經過加上一個值incr,改變全部段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址),以及起始地址。某些目標文件格式不容許隨便更改段的地址。
--change-section-address section{=,+,-} val
--adjust-section-vma section{=,+,-} val
設 置或者改變名爲section的段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)。若是這個選項中使用的是「=」,那麼名爲section的段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)將被設置成val;若是這個選項中使用的是「-」或者「+」,那麼上述兩個地址將被設置或者改變成這兩個地址的當前值減去或加上 val後的值。若是在輸入文件中名爲section的段不存在,那麼Objcopy將發出一個警告,除非--no-change-warnings選項被 使用。
這裏的段地址設置和改變都是輸出文件中的段相對於輸入文件中的段而言的。例如:
(1)--change-section-address .text = 10000
這裏是指將輸入文件(即源文件)中名爲.text的段拷貝到輸出文件中後,輸出文件中的.text段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)將都被設置成10000。
(2)--change-section-address .text + 100
這 裏是指將輸入文件(即源文件)中名爲.text的段拷貝到輸出文件中後,輸出文件中的.text段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)將都被設置成之前輸入文件中.text段的地址(當前地址)加上100後的值。
--change-section-lma section{=,+,-} val
僅 設置或者改變名爲section的段的LMA(Load Memory Address裝載地址)。一個段的LMA是程序被加載時,該段將被加載到的一段內存空間的首地址。一般LMA和VMA(Virtual Memory Address運行時地址)是相同的,可是在某些系統中,特別是在那些程序放在ROM的系統中,LMA和VMA是不相同的。若是這個選項中使用的是 「=」,那麼名爲section的段的LMA(Load Memory Address裝載地址)將被設置成val;若是這個選項中使用的是「-」或者「+」,那麼LMA將被設置或者改變成這兩個地址的當前值減去或加上val 後的值。若是在輸入文件中名爲section的段不存在,那麼Objcopy將發出一個警告,除非--no-change-warnings選項被使用。
--change-section-vma section{=,+,-} val
僅 設置或者改變名爲section的段的VMA(Load Memory Address裝載地址)。一個段的VMA是程序運行時,該段的定位地址。一般VMA和LMA(Virtual Memory Address運行時地址)是相同的,可是在某些系統中,特別是在那些程序放在ROM的系統中,LMA和VMA是不相同的。若是這個選項中使用的是 「=」,那麼名爲section的段的LMA(Load Memory Address裝載地址)將被設置成val;若是這個選項中使用的是「-」或者「+」,那麼LMA將被設置或者改變成這兩個地址的當前值減去或加上val 後的值。若是在輸入文件中名爲section的段不存在,那麼Objcopy將發出一個警告,除非--no-change-warnings選項被使用。
--change-warnings
--adjust-warnings
如 果命令行中使用了--change-section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,而且輸入文件中名爲section的段不存在,則Objcopy發出警告。這是默認的選項。
--no-chagne-warnings
--no-adjust-warnings
如 果命令行中使用了--change-section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,即便輸入文件中名爲section的段不存在, Objcopy也不會發出警告。
--set-section-flags section=flags
爲爲section的段設置一個標識。這個flags變量的能夠取逗號分隔的多個標識名字符串(這些標識名字符串是可以被Objcopy程序所識別的),合法的標識名有alloc,load,readonly,code,data和rom。
You can set the contents flag for a section which does not havecontents, but it is not meaningful to clear the contents flag of a section which does have contents; just remove the section instead. Not all flags are meaningful for all object file formats.
--add-section sectionname=filename
進 行目標文件拷貝的過程當中,在輸出文件中增長一個名爲sectionname的新段。這個新增長的段的內容從文件filename獲得。這個新增長的段的大 小就是這個文件filename的大小。只要輸出文件的格式容許該文件的段能夠有任意的段名(段名不是標準的,固定的),這個選項才能使用。
--change-leading-char
Some object file formats use special characters at the start of symbols. The most
common such character is underscore, which compilers often add before every
symbol. This option tells objcopy to change the leading character of every
symbol when it converts between object file formats. If the object file formats use
the same leading character, this option has no effect. Otherwise, it will add a
character, or remove a character, or change a character, as appropriate.
--remove-leading-char
If the first character of a global symbol is a special symbol leading character used
by the object file format, remove the character. The most common symbol leading
character is underscore. This option will remove a leading underscore from all
global symbols. This can be useful if you want to link together objects of different
file formats with different conventions for symbol names.
--weaken
Change all global symbols in the file to be weak. This can be useful when building
an object that will be linked against other objects using the -R option to the linker.
This option is only effective when using an object file format that supports weak
symbols.
-V
--version
Show the version number of objcopy.
-v
--verbose
Verbose output: list all object files modified. In the case of archives, objcopy -V
lists all members of the archive.
--help
Show a summary of the options to objcopy.


readelf基本用法

readelf 負責顯示ELF文件的信息 Usage: readelf <option(s)> elf-file(s)  Display information about the contents of ELF format files  Options are:   -a --all        所有       Equivalent to: -h -l -S -s -r -d -V -A -I   -h --file-header    文件頭   Display the ELF file header   -l --program-headers  程序 Display the program headers      --segments          An alias for --program-headers   -S --section-headers  段頭 Display the sections' header      --sections          An alias for --section-headers   -e --headers     所有頭      Equivalent to: -h -l -S   -s --syms        符號表      Display the symbol table       --symbols          An alias for --syms   -n --notes        內核註釋     Display the core notes (if present)   -r --relocs       重定位     Display the relocations (if present)   -u --unwind            Display the unwind info (if present)   -d --dynamic      動態段     Display the dynamic segment (if present)   -V --version-info  版本    Display the version sections (if present)   -A --arch-specific  CPU構架   Display architecture specific information (if any).   -D --use-dynamic   動態段    Use the dynamic section info when displaying symbols   -x --hex-dump=<number> 顯示 段內內容Dump the contents of section <number>   -w[liaprmfFso] or   --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]                   顯示DWARF2調試段內容       Display the contents of DWARF2 debug sections   -I --histogram         Di

相關文章
相關標籤/搜索