linux 下ar 命令的詳細解釋

2021-07-02 20:34:24 字數 3114 閱讀 5890

功能說明:建立或修改備存檔案,或是從備存檔案中抽取檔案。

語  法:ar[-dmpqrtx][cfossuvv][a《成員檔案》][b《成員檔案》][i《成員檔案》][備存檔案][成員檔案]

補充說明:ar可讓您集合許多檔案,成為單一的備存檔案。在備存檔案中,所有成員檔案皆保有原來的屬性與許可權。

參  數:

指令引數

-d  刪除備存檔案中的成員檔案。

-m  變更成員檔案在備存檔案中的次序。

-p  顯示備存檔案中的成員檔案內容。

-q  將問家附加在備存檔案末端。

-r  將檔案插入備存檔案中。

-t  顯示備存檔案中所包含的檔案。

-x  自備存檔案中取出成員檔案。

選項引數

a《成員檔案》  將檔案插入備存檔案中指定的成員檔案之後。

b《成員檔案》  將檔案插入備存檔案中指定的成員檔案之前。

c  建立備存檔案。

f  為避免過長的檔名不相容於其他系統的ar指令指令,因此可利用此引數,截掉要放入備存檔案中過長的成員檔名稱。

i《成員檔案》  將問家插入備存檔案中指定的成員檔案之前。

o  保留備存檔案中檔案的日期。

s  若備存檔案中包含了物件模式,可利用此引數建立備存檔案的符號表。

s  不產生符號表。

u  只將日期較新檔案插入備存檔案中。

v  程式執行時顯示詳細的資訊。

v  顯示版本資訊。

1.ar基本用法

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

下面是ar命令的格式:

ar [-][abcfilnopssuvv] [membername] [count] archive files...

例如我們可以用ar rv libtest.a hello.o hello1.o來生成乙個庫,庫名字是test,鏈結時可以用-ltest鏈結。該庫中存放了兩個模組hello.o和hello1.o。選項前可以有『-'字元,也可以沒有。下面我們來看看命令的操作選項和任選項。

現在我們把部分稱為操作選項,而[abcfilnopssuvv]部分稱為任選項。

中的操作選項在命令中只能並且必須使用其中乙個,

它們的含義如下:

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

2、ranlib命令

本小節的內容相對簡單。前邊提到過,靜態庫檔案需要使用「ar」來建立和維護。當給靜態庫增建乙個成員時(加入乙個.o檔案到靜態庫中),「ar」可直接 將需要增加的.o檔案簡單的追加到靜態庫的末尾。之後當我們使用這個庫進行連線生成可執行檔案時,鏈結程式「ld」卻提示錯誤,這可能是:主程式使用了之 前加入到庫中的.o檔案中定義的乙個函式或者全域性變數,但連線程式無法找到這個函式或者變數。

這個問題的原因是:之前我們將編譯完成的.o檔案直接加入到了庫的末尾,卻並沒有更新庫的有效符號表。連線程式進行連線時,在靜態庫的符號索引表中無法定 位剛才加入的.o檔案中定義的函式或者變數。這就需要在完成庫成員追加以後讓加入的所有.o檔案中定義的函式(變數)有效,完成這個工作需要使用另外乙個 工具「ranlib」來對靜態庫的符號索引表進行更新。 

我們所使用到的靜態庫(文件檔案)中,存在這樣乙個特殊的成員,它的名字是「__.symdef」。它包含了靜態庫中所有成員所定義的有效符號(函式名、 變數名)。因此,當為庫增加了乙個成員時,相應的就需要更新成員「__.symdef」,否則所增加的成員中定義的所有的符號將無法被連線程式定位。完成 更新的命令是:

ranlib archivefile

通常在makefile中我們可以這樣來實現:

libfoo.a: libfoo.a(x.o) libfoo.a(y.o) ...

ranlib libfoo.a

它所實現的是在更新靜態庫成員「x.o」和「y.o」之後,對靜態庫的成員「__.symdef」進行更新(更新庫的符號索引表)。

如果我們使用gnu ar工具來維護、管理靜態庫,我們就不需要考慮這一步。gnu ar本身已經提供了在更新庫的同時更新符號索引表的功能(這是預設行為,也可以通過命令列選項控制ar的具體行為。可參考 gnu ar工具的man手冊)。

gnu工具中ar是用來製作庫檔案.a的,但同時還提供了乙個ranlib,從手冊上看ranlib相當於ar -s,為什麼這樣呢?

這是由於最早在unix系統上ar程式是單純用來打包多個.o到.a(類似於tar做的事情),而不處理.o裡的符號表。linker程式則需 要.a檔案提供乙個完整的符號表,所以當時就寫了單獨的ranlib程式用來產生linker所需要的符號資訊,也就是說那時,產生乙個對linker合 格的的.a檔案需要做ar和ranlib兩步 。

很快,unix廠商就發現ranlib做得事情完全可以合併到ar裡面去,於是ar程式的公升級版本就包括了ranlib的功能,但早期的很多專案的makefile都已經是按照兩步式的方法生成.a,所以為了保證這些早期檔案的相容性,ranlib被保留下來了。

如今,gnu/linux系統上,ranlib依然存在,當然大部分專案已經不使用它了,因為ar -s就做了ranlib的工作。

歷史通常是進步和妥協的混合!

2.nm基本用法命令

nm用來列出目標檔案的符號清單。下面是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命令指出目標檔案,則nm假定目標檔案是a.out。下面列出該命令的任選項,大部分支援"-"開頭的短格式和"—"開頭的長格式。

linux 下ar 命令的詳細解釋

功能說明 建立或修改備存檔案,或是從備存檔案中抽取檔案。語 法 ar dmpqrtx cfossuvv a 成員檔案 b 成員檔案 i 成員檔案 備存檔案 成員檔案 補充說明 ar可讓您集合許多檔案,成為單一的備存檔案。在備存檔案中,所有成員檔案皆保有原來的屬性與許可權。參 數 指令引數 d 刪除備...

linux下 ar 命令使用

原文出處 ar命令簡介 ar命令可以用來建立 修改庫,也可以從庫中提出單個模組。1 如何檢視乙個靜態庫中包含那些.o檔案 ar t lib libname.a 2 ar命令的使用格式 ar 引數 lib libname.a file1.o file2.o filen.o ar命令的引數詳解 d 從庫...

linux命令之cd詳細解釋

linux cd 命令可以說是 linux 中最基本的命令語句,其他的命令語句要進行操作,都是建立在使用 cd 命令上的。所以,學習linux 常用命令,首先就要學好 cd 命令的使用方法技巧。1.命令格式 cd 目錄名 2.命令功能 切換當前目錄至dirname 3.常用範例 3.1 例一 進入系...