中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
OBJ文件格式分析工具: objdump, nm,ar
    • 首先簡要闡述關于gcc、glibc和 binutils模塊之間的關系

      一、關于gcc、glibc和binutils模塊之間的關系

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

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

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

      (15)stdlib,其它基本功能
       

      二、redhat9上升級gcc

      1、升級這些庫時,最好不要覆蓋系統(tǒng)中缺省的;因為這些庫,尤其是glibc庫,是系統(tǒng)中最核心的共享庫和工具,如果盲目覆蓋,很可能導致整個系統(tǒng) 癱瘓,因為一般更新glibc庫時,其它所有以來libc庫的共享庫都需要重新被編譯一遍。因此,為了調試某個程序進入glibc時,最好把glibc安 裝到/usr/local/lib下。

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

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

      4、編譯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的缺省庫搜索路徑,后面的比前面的優(yōu)先級高)
      (7)make install

       

      三、總結

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

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

           (可以通過“l(fā)d --verbose | grep SEARCH”來查看)

      3、二進制程序的搜索路徑順序為PATH環(huán)境變量中所設定。一般/usr/local/bin高于/usr/bin

      4、編譯時的頭文件的搜索路徑順序,與library的查找順序類似。一般/usr/local/include高于/usr/include

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

      前言
      如果普通編程不需要了解這些東西,如果想精確控制你的對象文件的格式或者你想查看一下文件對象里的內容以便作出某種判斷,剛你可以看一下下面的工 具:objdump, nm, ar。當然,本文不可能非常詳細的說明它們的使用方法和功能。如果你覺得本文不夠清楚,你可以使用:man. 我的計劃只是想讓更多的人了解這些工具,以后在今后 的編程過程中能有所幫助。


    • 庫文件操作命令:ar ----非常好的東東。。讓你能查看函數(shù)庫里的詳細情況和用多個對象文件生成一個庫文件。
      • 經 常用法:
        • 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:該操作是在一個庫中移動成員。當庫中如果有若干模塊有相同的符號定義(如函數(shù)定義),則成員的位置順序很重要。如果沒有指定任選項,任何指定的成員將 移到庫的最后。也可以使用'a','b',或'I'任選項移動到指定的位置。
        p:顯示庫中指定的成員到標準輸出。如果指定任選項v,則在輸出成員的內容前,將顯示成員的名字。如果沒有指定成員的名字,所有庫中的文件將顯示出來。
        q:快速追加。增加新模塊到庫的結尾處。并不檢查是否需要替換。'a','b',或'I'任選項對此操作沒有影響,模塊總是追加的庫的結尾處。如果使用了 任選項v則列出每個模塊。 這時,庫的符號表沒有更新,可以用'ar s'或ranlib來更新庫的符號表索引。
        r:在庫中插入模塊(替換)。當插入的模塊名已經在庫中存在,則替換同名的模塊。如果若干模塊中有一個模塊在庫中不存在,ar顯示一個錯誤消息,并不替換 其他同名模塊。默認的情況下,新的成員增加在庫的結尾處,可以使用其他任選項來改變增加的位置。
        t:顯示庫的模塊表清單。一般只顯示模塊名。
        x:從庫中提取一個成員。如果不指定要提取的模塊,則提取庫中所有的模塊。
        下面在看看可與操作選項結合使用的任選項:

        a:在庫的一個已經存在的成員后面增加一個新的文件。如果使用任選項a,則應該為命令行中membername參數(shù)指定一個已經存在的成員名。
        b:在庫的一個已經存在的成員前面增加一個新的文件。如果使用任選項b,則應該為命令行中membername參數(shù)指定一個已經存在的成員名。
        c:創(chuàng)建一個庫。不管庫是否存在,都將創(chuàng)建。
        f:在庫中截短指定的名字。缺省情況下,文件名的長度是不受限制的,可以使用此參數(shù)將文件名截短,以保證與其它系統(tǒng)的兼容。
        i:在庫的一個已經存在的成員前面增加一個新的文件。如果使用任選項i,則應該為命令行中membername參數(shù)指定一個已經存在的成員名(類似任選項 b)。
        l:暫未使用
        N:與count參數(shù)一起使用,在庫中有多個相同的文件名時指定提取或輸出的個數(shù)。
        o:當提取成員時,保留成員的原始數(shù)據(jù)。如果不指定該任選項,則提取出的模塊的時間將標為提取出的時間。
        P:進行文件名匹配時使用全路徑名。ar在創(chuàng)建庫時不能使用全路徑名(這樣的庫文件不符合POSIX標準),但是有些工具可以。
        s:寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。甚至對于沒有任何變化的庫也作該動作。對一個庫做ar s等同于對該庫做ranlib。
        S:不創(chuàng)建目標文件索引,這在創(chuàng)建較大的庫時能加快時間。
        u:一般說來,命令ar r...插入所有列出的文件到庫中,如果你只想插入列出文件中那些比庫中同名文件新的文件,就可以使用該任選項。該任選項只用于r操作選項。
        v:該選項用來顯示執(zhí)行操作選項的附加信息。
        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++函數(shù)名具有可讀性。
      -D或--dynamic:顯示動態(tài)符號。該任選項僅對于動態(tài)目標(例如特定類型的共享庫)有意義。
      -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:反轉排序的順序(例如,升序變?yōu)榻敌?。
      --size-sort:按大小排列符號順序。該大小是按照一個符號的值與它下一個符號的值進行計算的。
      -t radix或--radix=radix:使用radix進制顯示符號值。radix只能為"d"表示十進制、"o"表示八進制或"x"表示十六進制。
      --target=bfdname:指定一個目標代碼的格式,而非使用系統(tǒng)的默認格式。
      -u或--undefined-only:僅顯示沒有定義的符號(那些外部符號)。
      -l或--line-numbers:對每個符號,使用調試信息來試圖找到文件名和行號。對于已定義的符號,查找符號地址的行號。對于未定義符號,查找指 向符號重定位入口的行號。如果可以找到行號信息,顯示在符號信息之后。
      -V或--version:顯示nm的版本號。
      --help:顯示nm的任選項。
  • objdump  文件命令功能強的驚人。能實現(xiàn)上述兩個命令(ar,nm)的 很多功能。它主要是查看對象文件的內容信息。
    • 常用法:
      • objdump -h file<.o,.a,.out>//查看對象文件所有的節(jié)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系統(tǒng)下用Oasys
          編譯器生成的目標文件。objdump -i將給出這里可以指定的
          目標碼格式列表

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

      --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的區(qū)別不是很大,在源碼級調試的時候有用,要求
         編譯時使用了-g之類的調試編譯選項。

      --architecture=machine
      -m machine
          指定反匯編目標文件時使用的架構,當待反匯編文件本身沒有描述
          架構信息的時候(比如S-records),這個選項很有用??梢杂?i選項
          列出這里能夠指定的架構

      --reloc
      -r 顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯
         編后的格式顯示出來。

      --dynamic-reloc
      -R 顯示文件的動態(tài)重定位入口,僅僅對于動態(tài)目標文件有意義,比如某些
         共享庫。

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

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

      --source
      -S 盡可能反匯編出源代碼,尤其當編譯的時候指定了-g這種調試參數(shù)時,
         效果比較明顯。隱含了-d參數(shù)。

      --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
          從指定地址開始顯示數(shù)據(jù),該選項影響-d、-r和-s選項的輸出。

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

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

      --dynamic-syms
      -T 顯示文件的動態(tài)符號表入口,僅僅對動態(tài)目標文件有意義,比如某些
         共享庫。它顯示的信息類似于 nm -D|--dynamic 顯示的信息。

      --version 版本信息

          objdump --version

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

          objdump -x inet.o
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Binutils是什么
關于 gcc 中遇到的問題,這里有你想要的全部答案
glibc的編譯和調試
lfs簡要解析
linux下的lib文件
ubuntu10.04下建立交叉編譯工具鏈(支持軟浮點)全過程
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服