Linux基礎命令—ar

一生有你llx發表於2018-12-12
ar
      ar指令可以建立、修改庫,也可以從庫中提取單個模組。庫是一個單獨的檔案,裡面包含了按照特定結構組織起來的其他檔案,我們稱作member。歸檔檔案通常是一個二進位制檔案,我們一般將歸檔檔案當作庫來使用。原始檔案的內容、模式(許可權)、時間戳、所有者和組儲存在存檔中,並可在提取時恢復。
      GNU ar可以維護其成員具有任意長度的名稱的檔案;但是,根據您的系統上對ar的配置方式,可以對成員名長度進行限制,以便與其他工具維護的存檔格式相容。如果存在,限制通常是15個字元(典型的與a.out相關的格式)或16個字元(典型的與coff相關的格式)。
當您指定修飾符的時候,ar會為存檔中可重定位的物件模組中定義的符號建立一個索引。建立之後,每當ar對其內容進行更改時,這個索引就會在存檔中更新(除了Q更新操作外)。具有這樣一個索引的歸檔可以加速連結到庫,並允許庫中的例程相互呼叫,而不考慮它們在存檔中的位置。您可以使用“nm -s”或“nm –print-armap”列出此索引表。如果存檔缺少表,則可以使用另一種稱為ranlib的ar形式來新增表。
      GNU ar可以隨意建立一個瘦存檔,其中包含一個符號索引和對檔案成員檔案的原始副本的引用。這樣的存檔對於構建用於本地構建的庫非常有用,因為在本地構建中,可重新定位的物件將保持可用,而複製每個物件的內容只會浪費時間和空間。薄檔案也是扁平的,因此將一個或多個檔案新增到一個瘦歸檔中將單獨新增巢狀歸檔的元素。存檔元素的路徑是相對於歸檔本身儲存的。
      GNU Ar被設計成與兩個不同的設施相容。您可以使用命令列選項來控制它的活動,比如Unix系統上的不同型別的ar;或者,如果您指定了單一命令列選項-M,您可以使用標準輸入提供的指令碼來控制它,比如MRI “librarian”程式。
      此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、語法
      ar   [–plugin name]   [-X32_64]   [-]p[mod  [relpos]  [count]]   archive   [member…]

2、選項列表
      GNU ar允許您在第一個命令列引數中按任意順序混合操作程式碼p和修飾符標誌mod。如果您願意,可以用“-”開始第一個命令列引數。p鍵字母指定要執行的操作;它可能是以下任一操作,但您必須僅指定其中一個操作
      操作程式碼
      c,建立歸檔檔案
      d,刪除歸檔中的成員檔案,將要刪除的模組的名稱指定為member。如果沒有指定要刪除的檔案,則存檔將保持不變
      m,改變成員檔案在歸檔中的順序 。如果在多個成員中定義了一個符號,則存檔中成員的排序會改變程式使用庫連結的方式。如果在“m”中沒有使用修飾符,那麼在成員引數中命名的任何成員都會移動到歸檔檔案的末尾;您可以使用a、b或i修飾符將它們移動到指定的位置。
      p,將存檔的指定成員列印到標準輸出檔案。如果指定了v修飾符,請在將其內容複製到標準輸出之前顯示成員名。
      q,將檔案附加在歸檔檔案的最後。修飾符a、b和i不影響此操作;新成員總是放在歸檔的末尾。修飾符v在追加時使每個檔案都有ar列表。因為這個操作的重點是速度,所以存檔的符號表索引不會更新,即使它已經存在;您可以顯式地使用ar或ranlib來更新符號表索引。但是,有太多不同的系統假設快速追加索引,因此GNU ar實現了q作為r的同義詞。
      r,將檔案‘member’插入到歸檔檔案,如果歸檔中存在要插入的檔案,那麼就覆蓋。此操作與q的不同之處在於,如果現有成員的名稱與要新增的成員匹配,則刪除它們。如果成員中不存在‘member’,ar顯示錯誤訊息,並保持與該名稱匹配的任何現有存檔成員不受干擾。預設情況下,在檔案末尾新增新成員;但您可以使用其中一個修飾符a、b或i請求相對於現有成員的位置。與此操作一起使用的修飾符v將引發插入的每個檔案的一行輸出。字母a或r,以指示檔案是否被追加(沒有刪除舊成員)或被替換。
t
,顯示歸檔檔案包含的檔案列表。通常只顯示成員名稱;如果還希望檢視模式(許可權)、時間戳、所有者、組和大小,則還可以通過指定v修飾符來請求。如果未指定成員,則將列出存檔中的所有檔案。如果一個存檔中有多個同名檔案,只列出第一個例項;要檢視它們,您必須要求一個完整的列表。
x
,從歸檔檔案中提取成員檔案,您可以在此操作中使用v修飾符,在提取時請求ar列出每個名稱。如果不指定成員,則提取存檔中的所有檔案。無法從瘦存檔中提取檔案。
許多修飾符(Mod)可以緊跟p鍵,以指定操作行為的變化
      修飾符
      a,在存檔的現有成員之後新增新檔案。如果使用修飾符a,則現有存檔成員的名稱必須作為relpos引數出現在歸檔規範之前。
      b,在存檔的現有成員之前新增新檔案。如果使用修飾符b,則現有存檔成員的名稱必須作為relpos引數出現在歸檔規範之前。(與i相同)
      c,建立檔案。當您請求更新時,如果指定的存檔不存在,則始終建立它。但是,除非事先指定通過使用此修飾符來建立警告,否則將發出警告。
      D,在確定性模式下操作。當新增檔案和存檔索引時,對UID、GID、時間戳使用零,並對所有檔案使用一致的檔案模式。當使用此選項時,如果ar與相同的選項和相同的輸入檔案一起使用,則多次執行將建立相同的輸出檔案,而不管輸入檔案的所有者、組、檔案模式或修改時間。
      f,截斷存檔中的名稱。GNU ar通常允許任意長度的檔名。這將導致它建立與某些系統上的本機ar程式不相容的檔案。如果這是個問題,那麼當將f修飾符放在歸檔檔案中時,可以使用f修飾符來截斷檔名。
      i,在存檔的現有成員之前插入新檔案。如果使用修飾符i,則現有存檔成員的名稱必須作為relpos引數出現在歸檔規範之前。(與b相同)
      l,沒有用的修飾符
      N,使用計數引數。如果存檔中有多個具有相同名稱的條目,則使用此方法。從存檔中提取或刪除給定名稱的例項計數
      o,提取成員時保留成員的原始日期。如果不指定此修飾符,則從檔案中提取的檔案將加蓋提取時間。
      P,在存檔中匹配名稱時使用完整路徑名稱。GNU ar不能建立具有完整路徑名的存檔(這類檔案不是POSIX投訴),但其他歸檔建立者可以。此選項將導致GNU ar使用完整的路徑名匹配檔名,這在從另一個工具建立的歸檔檔案中提取單個檔案時非常方便。
      s,將物件檔案索引寫入存檔,或更新現有的索引,即使沒有對歸檔進行其他更改。您可以在任何操作中使用此修飾符標誌,也可以單獨使用。在存檔上執行ar等於在它上執行ranlib。
      S,不要生成存檔符號表。這可以加快構建一個大型庫的幾個步驟。結果存檔不能與連結器一起使用。為了構建符號表,必須在ar的最後一次執行時省略S修飾符,或者必須在歸檔檔案上執行ranlib。
      T,將指定的歸檔檔案設定為瘦存檔。如果它已經存在並且是一個常規存檔,則現有成員必須與存檔目錄相同。
      u,通常,ar r將列出的所有檔案插入存檔中。如果只想插入比同名的現有成員更新的檔案,請使用此修飾符。u修飾符僅允許用於操作r(替換)。特別是不允許使用組合qu,因為檢查時間戳將失去操作q的任何速度優勢。
      v,顯示詳細執行過程
      V,顯示ar的版本
      AR忽略初始選項-x32_64,以便與AIX相容。此選項產生的行為是GNU ar的預設行為。ar不支援任何其他-X選項;特別是,它不支援-x32,這是AIX ar的預設設定。
      可選的命令列開關“–plugin name”使ar載入名為name的外掛,這增加了對更多檔案格式的支援。只有在工具鏈已啟用外掛支援的情況下,此選項才可用。
      @file選項,從檔案中讀取命令列選項。已讀取的選項被插入以代替原始的@file選項。如果檔案不存在或無法讀取,則將按字面處理該選項,而不刪除該選項。file中的選項用空格分隔。可以在選項中包含空格字元,方法是將整個選項包圍在單引號或雙引號中。任何字元(包括反斜槓)都可以通過字首所包含的字元來包括在反斜槓中。file本身可能包含額外的@file選項;任何此類選項都將被遞迴處理。

3、例項
1)建立歸檔檔案
      [root@localhost weijie]# ar -rc mlib.a 1.c 2.c           //建立歸檔
      [root@localhost weijie]# ls
      11.c  1.c  1.c~  2.c  3.c  4.c  4.c~  5.c  6.c  mlib.a
      [root@localhost weijie]# ar -t mlib.a                      //檢視歸檔的檔案列表
      1.c
      2.c
2)在歸檔中插入檔案
      [root@localhost weijie]# ar -rc mlib.a 3.c              //插入3.c,此時歸檔中還沒有3.c
      [root@localhost weijie]# ar -t mlib.a                   //檢視檔案列表,3.c被加入
      1.c
      2.c
      3.c
      [root@localhost weijie]# ar -rc mlib.a 1.c            //插入1.c,注意此時1.c已經存在了
      [root@localhost weijie]# ar -t mlib.a                  //檢視檔案列表,1.c已經被覆蓋了
      1.c
      2.c
      3.c 
3)在歸檔的最後插入檔案 
      [root@localhost weijie]# ar -q mlib.a 1.c             //是用選項q來追加到最後,注意這個和r是不一樣的
      [root@localhost weijie]# ar -t mlib.a                  //檢視檔案列表,新增加了1.c
      1.c
      2.c
      3.c
      1.c
4)從歸檔中刪除檔案 
      [root@localhost weijie]# ar -d mlib.a 1.c             //刪除1.c
      [root@localhost weijie]# ar -t mlib.a                  //檢視檔案列表,第一個1.c已經刪除,但是最後還有一個
      2.c
      3.c
      1.c
      [root@localhost weijie]# ar -d mlib.a 1.c             //再次刪除1。C
      [root@localhost weijie]# ar -t mlib.a                  //檢視檔案列表,1.c已經被刪除
      2.c
      3.c

相關文章