每天一個 Linux 命令:ar 命令

1. 命令簡介

ar(ARchiver)命令是 GNU Binutils 的一員,可以用來創建、修改靜態庫,也可以從靜態庫中提取單個模塊。靜態庫是一個獨立的文件,裏面包含了按照特定的結構組織起來的其它的一些文件(稱做此庫文件的 member)。原始文件的內容、訪問模式、時間戳、屬主和組等屬性都保留在庫文件中。

2. 命令格式

ar [--plugin <name>] [-X32_64] [-]<d|m|p|q|r|s|t|x>[abcDfilNoPsSTuUvV [relpos] [count]] [--target <bfdname>] [archive] [member...]

其中連字符[-]是可選的,選項<d|m|p|q|r|s|t|x>爲操作選項,使用時只能使用其中一個,選項[abcDfilNoPsSTuUvV]爲修飾選項,用來修飾操作選項,與操作選項配合使用時,二者的順序可以任意。[relpos]表示庫中的成員名,用於加入新文件時指定相對位置,與選項 a、b 和 i 結合使用。[count]表示在庫中有多個同名的成員時,指定提取或刪除的個數。[archive]爲庫名稱,[member...]爲庫的成員名稱。

3. 選項說明

#操作選項說明
d:Delete,從庫中刪除由[member...]指定的模塊,如果使用了修飾選項v則列出被刪除的每個模塊
m:Move,該操作是在一個庫中移動成員。當庫中如果有若干模塊有相同的符號定義(如函數定義),則成員的位置順序很重要。如果沒有指定任選項,任何指定的成員將移到庫的最後。也可以使用a,b或i選項指定移動到的位置
p:Print,顯示庫中指定的成員到標準輸出。如果指定修飾選項v,則在輸出成員的內容前,將顯示成員的名字。如果沒有指定成員的名字,所有庫中的文件將顯示出來
q:Quick append,快速追加。增加新模塊到庫的結尾處。並不檢查是否需要替換。a,b或 i 修飾選項對此操作沒有影響,模塊總是追加到庫的結尾處。如果使用了修飾選項v則列出每個模塊。這時,庫的符號表沒有更新,可以用ar s或ranlib來更新庫的符號表索引
r:Replacement,以替換模式向庫中插入成員。當插入的模塊名已經在庫中存在,則替換同名的模塊。默認的情況下,新的成員增加在庫的結尾處,可以使用其他任選項a,b或i來改變增加的位置
s:寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。甚至對於沒有任何變化的庫也作該動作。對一個庫做ar s等同於對該庫做ranlib。注意,s也可以作爲修飾選項來使用
t:Table,顯示庫的模塊表清單。如果指定文件名稱,則僅顯示指定的那些文件。如果不指定任何文件,則列出庫中的所有文件。一般只顯示模塊名,如果結合選項v可顯示文件的訪問權限、時間戳、屬主和組等信息
x:eXtract,從庫中提取一個成員。如果不指定要提取的模塊,則提取庫中所有的模塊

#修飾選項說明
a:After,在庫的一個已經存在的成員後面增加一個新的文件。已經存在的成員由relpos 參數指定
b:Before,在庫的一個已經存在的成員前面增加一個新的文件。已經存在的成員由relpos 參數指定
c:Create,創建一個庫。不管庫是否存在,都將創建
D:Deterministic,以確定性模式操作。添加文件和存檔索引時,對uids、gid、時間戳使用零,對所有文件使用一致的文件模式。使用此選項時,如果ar與相同的選項和相同的輸入文件一起使用,則多次運行將創建相同的輸出文件,而不考慮輸入文件的所有者、組和文件。模式或修改時間。如果binutils配置爲--enable deterministic archives,那麼默認情況下,此模式爲on。可以使用下面的U修飾符禁用它
f:在庫中截短指定的名字。缺省情況下,文件名的長度是不受限制的,可以使用此參數將文件名截短,以保證與其它系統的兼容
i:Insert,在庫中一個已經存在的成員前面增加一個新的文件已經存在的成員由relpos 參數指定(類似選項b)
l:暫未使用
N:與[count]參數一起使用,在庫中有多個相同的文件名時指定提取或刪除的個數
o:Original,當提取成員時,保留成員的原始數據。如果不指定該選項,則提取出的模塊的時間將標爲提取出的時間
P:進行文件名匹配時使用全路徑名。ar在創建庫時不能使用全路徑名(這樣的庫文件不符合POSIX標準),但是有些工具可以。此選項將導致GNU AR使用完整的路徑名匹配文件名,這在從另一個工具創建的存檔中提取單個文件時非常方便
s:等同於操作選項s,具體見必選項s的說明
S:不創建目標文件索引,這在創建較大的庫時能加快時間
T:Thin,將指定的存檔設爲精簡存檔。如果庫已經存在並且是常規庫,則現有成員必須與存檔位於同一目錄中
u:一般說來,命令ar r member...插入所有列出的文件到庫中,如果你只想插入列出文件中那些比庫中同名文件新的文件,可以使用該選項。該選項只與 r 操作選項一起使用
U:Undeterministic,不要在確定性模式下操作。這與上面的D選項相反:被添加的文件和存檔索引將獲得它們的實際uid、gid、時間戳和文件訪問權限模式值。
v:該選項用來顯示執行操作選項的附加信息
V,--version:顯示ar的版本信息

#其它選項說明
--help:顯示ar的幫助信息
--plugin:使ar加載指定的插件,這增加了對更多文件格式的支持。只有工具鏈構建時開啓了插件支持的情況下,此選項纔可用
-X32_64:此選項是GNU ar的默認選項,AR不支持任何其他-X選項,比如-x32,此選項是AIX ar的默認選項
--target:當庫成員的目標文件格式與系統的默認格式不同時指定具體的格式

4. 常用示例

(1)創建一個靜態庫。

ar crv libtest.a hello.o dablelv.o

(2)從靜態庫中提取指定目標文件。

ar x /usr/lib64/libc.a errno.o

(3)查看靜態庫中指定目標文件的詳細信息。

ar tv /usr/lib64/libc.a errno.o
rw-r--r-- 1000/135   1106 Feb 14 10:14 2017 errno.o

(4)從靜態庫中要刪除一個成員。注意,刪除前請備份 C 標準靜態庫 libc.a。

ar dv libc.a strlen.o

參考文獻

[1] ar manual

[2] GNU Binutils

[3] linux ar 命令

[4] ar (Unix).wikipedia

轉自:戀貓大鯉魚

https://dablelv.blog.csdn.net/article/details/89066764

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/XagA23xgGMXg8zjK9D9t6Q