如何查看靜態(tài)庫(kù)內(nèi)容 Unix/Linux
- 加入技術(shù)交流群
掃碼加入
和技術(shù)大咖面對(duì)面交流
海量資料庫(kù)查詢
如何查看靜態(tài)庫(kù)內(nèi)容 Unix/Linux
以下從最好情況->最壞情況:
1. 最好知道靜態(tài)庫(kù)的原文件(.c),要是知道聲明文件(.h)也比較好。
2. ar -t YourFile 看其結(jié)構(gòu),找其中的原文件。
3. 可以將庫(kù)文件下到本地用UE打開,然后你就找吧。
另外,看動(dòng)態(tài)庫(kù)用 nm -D lib*.so
附:
1.ar基本用法
2.nm基本用法命令
當(dāng)我們的程序中有經(jīng)常使用的模塊,而且這種模塊在其他程序中也會(huì)用到,這時(shí)按照軟件重用的思想,我們應(yīng)該將它們生成庫(kù),使得以后編程可以減少開發(fā)代碼量。這里介紹兩個(gè)命令ar和nm,用來(lái)對(duì)庫(kù)操作。
1.ar基本用法
ar命令可以用來(lái)創(chuàng)建、修改庫(kù),也可以從庫(kù)中提出單個(gè)模塊。庫(kù)是一單獨(dú)的文件,里面包含了按照特定的結(jié)構(gòu)組織起來(lái)的其它的一些文件(稱做此庫(kù)文件的member)。原始文件的內(nèi)容、模式、時(shí)間戳、屬主、組等屬性都保留在庫(kù)文件中。
下面是ar命令的格式:
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
例如我們可以用ar rv libtest.a hello.o hello1.o來(lái)生成一個(gè)庫(kù),庫(kù)名字是test,鏈接時(shí)可以用-ltest鏈接。該庫(kù)中存放了兩個(gè)模塊hello.o和hello1.o。選項(xiàng)前可以有‘-‘字符,也可以沒有。下面我們來(lái)看看命令的操作選項(xiàng)和任選項(xiàng)?,F(xiàn)在我們把{dmpqrtx}部分稱為操作選項(xiàng),而[abcfilNoPsSuvV]部分稱為任選項(xiàng)。
{dmpqrtx}中的操作選項(xiàng)在命令中只能并且必須使用其中一個(gè),它們的含義如下:
d:從庫(kù)中刪除模塊。按模塊原來(lái)的文件名指定要?jiǎng)h除的模塊。如果使用了任選項(xiàng)v則列出被刪除的每個(gè)模塊。
m:該操作是在一個(gè)庫(kù)中移動(dòng)成員。當(dāng)庫(kù)中如果有若干模塊有相同的符號(hào)定義(如函數(shù)定義),則成員的位置順序很重要。如果沒有指定任選項(xiàng),任何指定的成員將移到庫(kù)的最后。也可以使用'a','b',或'I'任選項(xiàng)移動(dòng)到指定的位置。
p:顯示庫(kù)中指定的成員到標(biāo)準(zhǔn)輸出。如果指定任選項(xiàng)v,則在輸出成員的內(nèi)容前,將顯示成員的名字。如果沒有指定成員的名字,所有庫(kù)中的文件將顯示出來(lái)。
q:快速追加。增加新模塊到庫(kù)的結(jié)尾處。并不檢查是否需要替換。'a','b',或'I'任選項(xiàng)對(duì)此操作沒有影響,模塊總是追加的庫(kù)的結(jié)尾處。如果使用了任選項(xiàng)v則列出每個(gè)模塊。 這時(shí),庫(kù)的符號(hào)表沒有更新,可以用'ar s'或ranlib來(lái)更新庫(kù)的符號(hào)表索引。
r:在庫(kù)中插入模塊(替換)。當(dāng)插入的模塊名已經(jīng)在庫(kù)中存在,則替換同名的模塊。如果若干模塊中有一個(gè)模塊在庫(kù)中不存在,ar顯示一個(gè)錯(cuò)誤消息,并不替換其他同名模塊。默認(rèn)的情況下,新的成員增加在庫(kù)的結(jié)尾處,可以使用其他任選項(xiàng)來(lái)改變?cè)黾拥奈恢谩?nbsp;
t:顯示庫(kù)的模塊表清單。一般只顯示模塊名。
x:從庫(kù)中提取一個(gè)成員。如果不指定要提取的模塊,則提取庫(kù)中所有的模塊。
下面在看看可與操作選項(xiàng)結(jié)合使用的任選項(xiàng):
a:在庫(kù)的一個(gè)已經(jīng)存在的成員后面增加一個(gè)新的文件。如果使用任選項(xiàng)a,則應(yīng)該為命令行中membername參數(shù)指定一個(gè)已經(jīng)存在的成員名。
b:在庫(kù)的一個(gè)已經(jīng)存在的成員前面增加一個(gè)新的文件。如果使用任選項(xiàng)b,則應(yīng)該為命令行中membername參數(shù)指定一個(gè)已經(jīng)存在的成員名。
c:創(chuàng)建一個(gè)庫(kù)。不管庫(kù)是否存在,都將創(chuàng)建。
f:在庫(kù)中截短指定的名字。缺省情況下,文件名的長(zhǎng)度是不受限制的,可以使用此參數(shù)將文件名截短,以保證與其它系統(tǒng)的兼容。
i:在庫(kù)的一個(gè)已經(jīng)存在的成員前面增加一個(gè)新的文件。如果使用任選項(xiàng)i,則應(yīng)該為命令行中membername參數(shù)指定一個(gè)已經(jīng)存在的成員名(類似任選項(xiàng)b)。
l:暫未使用
N:與count參數(shù)一起使用,在庫(kù)中有多個(gè)相同的文件名時(shí)指定提取或輸出的個(gè)數(shù)。
o:當(dāng)提取成員時(shí),保留成員的原始數(shù)據(jù)。如果不指定該任選項(xiàng),則提取出的模塊的時(shí)間將標(biāo)為提取出的時(shí)間。
P:進(jìn)行文件名匹配時(shí)使用全路徑名。ar在創(chuàng)建庫(kù)時(shí)不能使用全路徑名(這樣的庫(kù)文件不符合POSIX標(biāo)準(zhǔn)),但是有些工具可以。
s:寫入一個(gè)目標(biāo)文件索引到庫(kù)中,或者更新一個(gè)存在的目標(biāo)文件索引。甚至對(duì)于沒有任何變化的庫(kù)也作該動(dòng)作。對(duì)一個(gè)庫(kù)做ar s等同于對(duì)該庫(kù)做ranlib。
S:不創(chuàng)建目標(biāo)文件索引,這在創(chuàng)建較大的庫(kù)時(shí)能加快時(shí)間。
u:一般說(shuō)來(lái),命令ar r...插入所有列出的文件到庫(kù)中,如果你只想插入列出文件中那些比庫(kù)中同名文件新的文件,就可以使用該任選項(xiàng)。該任選項(xiàng)只用于r操作選項(xiàng)。
v:該選項(xiàng)用來(lái)顯示執(zhí)行操作選項(xiàng)的附加信息。
V:顯示ar的版本。
2.nm基本用法命令
nm用來(lái)列出目標(biāo)文件的符號(hà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] [-f format|--format=format][--target=bfdname] [objfile...]
如果沒有為nm命令指出目標(biāo)文件,則nm假定目標(biāo)文件是a.out。下面列出該命令的任選項(xiàng),大部分支持"-"開頭的短格式和"—"開頭的長(zhǎng)格式。
-A、-o或--print-file-name:在找到的各個(gè)符號(hào)的名字前加上文件名,而不是在此文件的所有符號(hào)前只出現(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)試符號(hào)。
-B:等同于--format=bsd,用來(lái)兼容MIPS的nm。
-C或--demangle:將低級(jí)符號(hào)名解碼(demangle)成用戶級(jí)名字。這樣可以使得C++函數(shù)名具有可讀性。
-D或--dynamic:顯示動(dòng)態(tài)符號(hào)。該任選項(xiàng)僅對(duì)于動(dòng)態(tài)目標(biāo)(例如特定類型的共享庫(kù))有意義。
-f format:使用format格式輸出。format可以選取bsd、sysv或posix,該選項(xiàng)在GNU的nm中有用。默認(rèn)為bsd。
-g或--extern-only:僅顯示外部符號(hào)。
-n、-v或--numeric-sort:按符號(hào)對(duì)應(yīng)地址的順序排序,而非按符號(hào)名的字符順序。
-p或--no-sort:按目標(biāo)文件中遇到的符號(hào)順序顯示,不排序。
-P或--portability:使用POSIX.2標(biāo)準(zhǔn)輸出格式代替默認(rèn)的輸出格式。等同于使用任選項(xiàng)-f posix。
-s或--print-armap:當(dāng)列出庫(kù)中成員的符號(hào)時(shí),包含索引。索引的內(nèi)容包含:哪些模塊包含哪些名字的映射。
-r或--reverse-sort:反轉(zhuǎn)排序的順序(例如,升序變?yōu)榻敌?。
--size-sort:按大小排列符號(hào)順序。該大小是按照一個(gè)符號(hào)的值與它下一個(gè)符號(hào)的值進(jìn)行計(jì)算的。
-t radix或--radix=radix:使用radix進(jìn)制顯示符號(hào)值。radix只能為"d"表示十進(jìn)制、"o"表示八進(jìn)制或"x"表示十六進(jìn)制。
--target=bfdname:指定一個(gè)目標(biāo)代碼的格式,而非使用系統(tǒng)的默認(rèn)格式。
-u或--undefined-only:僅顯示沒有定義的符號(hào)(那些外部符號(hào))。
-l或--line-numbers:對(duì)每個(gè)符號(hào),使用調(diào)試信息來(lái)試圖找到文件名和行號(hào)。對(duì)于已定義的符號(hào),查找符號(hào)地址的行號(hào)。對(duì)于未定義符號(hào),查找指向符號(hào)重定位入口的行號(hào)。如果可以找到行號(hào)信息,顯示在符號(hào)信息之后。
-V或--version:顯示nm的版本號(hào)。
--help:顯示nm的任選項(xiàng)。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
電路圖文章專題:電路圖符號(hào)大全
電路圖符號(hào)相關(guān)文章:電路圖符號(hào)大全