日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ar 和 nm 用法

發(fā)布時(shí)間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ar 和 nm 用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?From: http://blog.chinaunix.net/space.php?uid=7685522&do=blog&id=2045788

當(dāng)我們的程序中有經(jīng)常使用的模塊,而且這種模塊在其他程序中也會用到,這時(shí)按照軟件重用的思想,我們應(yīng)該將它們生成庫,使得以后編程可以減少開發(fā)代碼量。這里介紹兩個(gè)命令ar和nm,用來對庫操作。

1.ar基本用法
2.nm基本用法命令

 當(dāng)我們的程序中有經(jīng)常使用的模塊,而且這種模塊在其他程序中也會用到,這時(shí)按照軟件重用的思想,我們應(yīng)該將它們生成庫,使得以后編程可以減少開發(fā)代碼量。這里介紹兩個(gè)命令ar和nm,用來對庫操作。

1.ar基本用法

  ar命令可以用來創(chuàng)建、修改庫,也可以從庫中提出單個(gè)模塊。庫是一單獨(dú)的文件,里面包含了按照特定的結(jié)構(gòu)組織起來的其它的一些文件(稱做此庫文件的member)。原始文件的內(nèi)容、模式、時(shí)間戳、屬主、組等屬性都保留在庫文件中。

  下面是ar命令的格式:

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

  例如我們可以用ar rv libtest.a hello.o hello1.o來生成一個(gè)庫,庫名字是test,鏈接時(shí)可以用-ltest鏈接。該庫中存放了兩個(gè)模塊hello.o和hello1.o。選項(xiàng)前可以有‘-'字符,也可以沒有。下面我們來看看命令的操作選項(xiàng)和任選項(xiàng)。現(xiàn)在我們把{dmpqrtx}部分稱為操作選項(xiàng),而[abcfilNoPsSuvV]部分稱為任選項(xiàng)。

  {dmpqrtx}中的操作選項(xiàng)在命令中只能并且必須使用其中一個(gè),它們的含義如下:

  • d:從庫中刪除模塊。按模塊原來的文件名指定要刪除的模塊。如果使用了任選項(xiàng)v則列出被刪除的每個(gè)模塊。
  • m:該操作是在一個(gè)庫中移動成員。當(dāng)庫中如果有若干模塊有相同的符號定義(如函數(shù)定義),則成員的位置順序很重要。如果沒有指定任選項(xiàng),任何指定的成員將移到庫的最后。也可以使用'a','b',或'I'任選項(xiàng)移動到指定的位置。
  • p:顯示庫中指定的成員到標(biāo)準(zhǔn)輸出。如果指定任選項(xiàng)v,則在輸出成員的內(nèi)容前,將顯示成員的名字。如果沒有指定成員的名字,所有庫中的文件將顯示出來。
  • q:快速追加。增加新模塊到庫的結(jié)尾處。并不檢查是否需要替換。'a','b',或'I'任選項(xiàng)對此操作沒有影響,模塊總是追加的庫的結(jié)尾處。如果使用了任選項(xiàng)v則列出每個(gè)模塊。 這時(shí),庫的符號表沒有更新,可以用'ar s'或ranlib來更新庫的符號表索引。
  • r:在庫中插入模塊(替換)。當(dāng)插入的模塊名已經(jīng)在庫中存在,則替換同名的模塊。如果若干模塊中有一個(gè)模塊在庫中不存在,ar顯示一個(gè)錯(cuò)誤消息,并不替換其他同名模塊。默認(rèn)的情況下,新的成員增加在庫的結(jié)尾處,可以使用其他任選項(xiàng)來改變增加的位置。
  • t:顯示庫的模塊表清單。一般只顯示模塊名。
  • x:從庫中提取一個(gè)成員。如果不指定要提取的模塊,則提取庫中所有的模塊。

  下面在看看可與操作選項(xiàng)結(jié)合使用的任選項(xiàng):

  • a:在庫的一個(gè)已經(jīng)存在的成員后面增加一個(gè)新的文件。如果使用任選項(xiàng)a,則應(yīng)該為命令行中membername參數(shù)指定一個(gè)已經(jīng)存在的成員名。
  • b:在庫的一個(gè)已經(jīng)存在的成員前面增加一個(gè)新的文件。如果使用任選項(xiàng)b,則應(yīng)該為命令行中membername參數(shù)指定一個(gè)已經(jīng)存在的成員名。
  • c:創(chuàng)建一個(gè)庫。不管庫是否存在,都將創(chuàng)建。
  • f:在庫中截短指定的名字。缺省情況下,文件名的長度是不受限制的,可以使用此參數(shù)將文件名截短,以保證與其它系統(tǒng)的兼容。
  • i:在庫的一個(gè)已經(jīng)存在的成員前面增加一個(gè)新的文件。如果使用任選項(xiàng)i,則應(yīng)該為命令行中membername參數(shù)指定一個(gè)已經(jīng)存在的成員名(類似任選項(xiàng)b)。
  • l:暫未使用
  • N:與count參數(shù)一起使用,在庫中有多個(gè)相同的文件名時(shí)指定提取或輸出的個(gè)數(shù)。
  • o:當(dāng)提取成員時(shí),保留成員的原始數(shù)據(jù)。如果不指定該任選項(xiàng),則提取出的模塊的時(shí)間將標(biāo)為提取出的時(shí)間。
  • P:進(jìn)行文件名匹配時(shí)使用全路徑名。ar在創(chuàng)建庫時(shí)不能使用全路徑名(這樣的庫文件不符合POSIX標(biāo)準(zhǔn)),但是有些工具可以。
  • s:寫入一個(gè)目標(biāo)文件索引到庫中,或者更新一個(gè)存在的目標(biāo)文件索引。甚至對于沒有任何變化的庫也作該動作。對一個(gè)庫做ar s等同于對該庫做ranlib。
  • S:不創(chuàng)建目標(biāo)文件索引,這在創(chuàng)建較大的庫時(shí)能加快時(shí)間。
  • u:一般說來,命令ar r...插入所有列出的文件到庫中,如果你只想插入列出文件中那些比庫中同名文件新的文件,就可以使用該任選項(xiàng)。該任選項(xiàng)只用于r操作選項(xiàng)。
  • v:該選項(xiàng)用來顯示執(zhí)行操作選項(xiàng)的附加信息。
  • V:顯示ar的版本。
  • 2.nm基本用法命令

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

      nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle][-D|--dynamic] [-s|--print-armap][-o|--print-file-name][-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort][--size-sort][-u|--undefined-only] [-l|--line-numbers][--help][--version] [-t radix|--radix=radix][-P|--portability] [-fformat|--format=format][--target=bfdname] [objfile...]

      如果沒有為nm命令指出目標(biāo)文件,則nm假定目標(biāo)文件是a.out。下面列出該命令的任選項(xiàng),大部分支持"-"開頭的短格式和"—"開頭的長格式。

    • -A、-o或--print-file-name:在找到的各個(gè)符號的名字前加上文件名,而不是在此文件的所有符號前只出現(xiàn)文件名一次。

      例如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:顯示調(diào)試符號。
    • -B:等同于--format=bsd,用來兼容MIPS的nm。
    • -C或--demangle:將低級符號名解碼(demangle)成用戶級名字。這樣可以使得C++函數(shù)名具有可讀性。
    • -D或--dynamic:顯示動態(tài)符號。該任選項(xiàng)僅對于動態(tài)目標(biāo)(例如特定類型的共享庫)有意義。
    • -f format:使用format格式輸出。format可以選取bsd、sysv或posix,該選項(xiàng)在GNU的nm中有用。默認(rèn)為bsd。
    • -g或--extern-only:僅顯示外部符號。
    • -n、-v或--numeric-sort:按符號對應(yīng)地址的順序排序,而非按符號名的字符順序。
    • -p或--no-sort:按目標(biāo)文件中遇到的符號順序顯示,不排序。
    • -P或--portability:使用POSIX.2標(biāo)準(zhǔn)輸出格式代替默認(rèn)的輸出格式。等同于使用任選項(xiàng)-f posix。
    • -s或--print-armap:當(dāng)列出庫中成員的符號時(shí),包含索引。索引的內(nèi)容包含:哪些模塊包含哪些名字的映射。
    • -r或--reverse-sort:反轉(zhuǎn)排序的順序(例如,升序變?yōu)榻敌?。
    • --size-sort:按大小排列符號順序。該大小是按照一個(gè)符號的值與它下一個(gè)符號的值進(jìn)行計(jì)算的。
    • -t radix或--radix=radix:使用radix進(jìn)制顯示符號值。radix只能為"d"表示十進(jìn)制、"o"表示八進(jìn)制或"x"表示十六進(jìn)制。
    • --target=bfdname:指定一個(gè)目標(biāo)代碼的格式,而非使用系統(tǒng)的默認(rèn)格式。
    • -u或--undefined-only:僅顯示沒有定義的符號(那些外部符號)。
    • -l或--line-numbers:對每個(gè)符號,使用調(diào)試信息來試圖找到文件名和行號。對于已定義的符號,查找符號地址的行號。對于未定義符號,查找指向符號重定位入口的行號。如果可以找到行號信息,顯示在符號信息之后。
    • -V或--version:顯示nm的版本號。
    • --help:顯示nm的任選項(xiàng)。


    From: http://hi.baidu.com/zzgmtv/blog/item/d021d7437d38d91f72f05d57.html ?

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

    符號類型說明
    A該符號的值是絕對的,在以后的鏈接過程中,不允許進(jìn)行改變。這樣的符號值,常常出現(xiàn)在中斷向量表中,例如用符號來表示各個(gè)中斷向量函數(shù)在中斷向量表中的位置。
    B該符號的值出現(xiàn)在非初始化數(shù)據(jù)段(bss)中。例如,在一個(gè)文件中定義全局static int test。則該符號test的類型為b,位于bss section中。其值表示該符號在bss段中的偏移。一般而言,bss段分配于RAM
    C該符號為commoncommon symbol是未初始話數(shù)據(jù)段。該符號沒有包含于一個(gè)普通section中。只有在鏈接過程中才進(jìn)行分配。符號的值表示該符號需要的字節(jié)數(shù)。例如在一個(gè)c文件中,定義int test,并且該符號在別的地方會被引用,則該符號類型即為C。否則其類型為B
    D該符號位于初始話數(shù)據(jù)段中。一般來說,分配到data section中。例如定義全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},則會分配于初始化數(shù)據(jù)段中
    G該符號也位于初始化數(shù)據(jù)段中。主要用于small object提高訪問small data object的一種方式。
    I該符號是對另一個(gè)符號的間接引用。
    N該符號是一個(gè)debugging符號。
    R該符號位于只讀數(shù)據(jù)區(qū)。例如定義全局const int test[] = {123, 123};test就是一個(gè)只讀數(shù)據(jù)區(qū)的符號。注意在cygwin下如果使用gcc直接編譯成MZ格式時(shí),源文件中的test對應(yīng)_test,并且其符號類型為D,即初始化數(shù)據(jù)段中。但是如果使用m6812-elf-gcc這樣的交叉編譯工具,源文件中的test對應(yīng)目標(biāo)文件的test,即沒有添加下劃線,并且其符號類型為R。一般而言,位于rodata section。值得注意的是,如果在一個(gè)函數(shù)中定義const char *test = “abc”, const char test_int = 3。使用nm都不會得到符號信息,但是字符串“abc”分配于只讀存儲器中,testrodata section中,大小為4
    S符號位于非初始化數(shù)據(jù)區(qū),用于small object
    T該符號位于代碼區(qū)text section
    U該符號在當(dāng)前文件中是未定義的,即該符號的定義在別的文件中。例如,當(dāng)前文件調(diào)用另一個(gè)文件中定義的函數(shù),在這個(gè)被調(diào)用的函數(shù)在當(dāng)前就是未定義的;但是在定義它的文件中類型是T。但是對于全局變量來說,在定義它的文件中,其符號類型為C,在使用它的文件中,其類型為U
    V該符號是一個(gè)weak object
    WThe symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
    -該符號是a.out格式文件中的stabs symbol
    ?該符號類型沒有定義

?


總結(jié)

以上是生活随笔為你收集整理的ar 和 nm 用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。