binutils工具集之---ar
1.如果要將多個.o文件生成一個庫文件,則存在兩種類型的庫,一種是靜態庫,在linux里面后綴是.a,另一種是動態庫,后綴為.so。
當可執行程序要與靜態庫進行鏈接時,所用到的庫中的函數和數據會被拷貝到最終的可執行程序中。而采用動態庫則不會,程序加載器在后臺為我們講所需的動態庫自動加載到內存中且保證整個系統只有一份拷貝。
如果一個系統中存在多個需要同時運行的程序且這些程序之間存在共享庫,那么采用動態庫的形式將更節省內存。但是對于嵌入式系統,大多數情況下都是整個軟件就是一個可執行程序且不支持動態加載的方式,即以靜態庫為主。
eg:
創建foo.c bar.c文件,
1 #include <stdio.h> 2 void bar() 3 { 4 printf("This is bar()!\n"); 5 } 1 #include<stdio.h> 2 void foo() 3 { 4 printf("This is foo()!\n"); 5 }然后把這兩個函數放在靜態庫libmy.a中,在此之前,需要將他們編譯成.o目標文件,然后生成靜態庫。
gcc -c foo.c bar.c
ar crs libmy.a foo.o bar.o
ar的c參數表示創建一個檔案文件,而r參數指示將文件增加到所創建的庫文件中,s參數就是為了生成庫索引以提高庫被鏈接時的效率。
ar --help:
用法:ar [仿真選項] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <名稱>] [成員名] [計數] 歸檔 文件…
ar -M [<mri-腳本]
命令:
d - 從歸檔文件中刪除文件
m[ab] - 在歸檔文件中移動文件
p - 打印在歸檔文件中找到的文件
q[f] - 將文件快速追加到歸檔文件中
r[ab][f][u] - 替換歸檔文件中已有的文件或加入新文件
s - 作為 ranlib 工作
t - 顯示歸檔文件的內容
x[o] - 從歸檔文件中分解文件
特定命令修飾符:
[a] - 將文件置于 [成員名] 之后
[b] - 將文件置于 [成員名] 之前 (于 [i] 相同)
[D] - 將 0 用于時間戳和 uid/gid(默認)
[D] - 使用實際時間戳和 uid/gid
[N] - 使用名稱的實例 [數量]
[f] - 截去插入的文件名稱
[P] - 在匹配時使用完整的路徑名
[o] - 保留原來的日期
[u] - 只替換比當前歸檔內容更新的文件
通用修飾符:
[c] - 不在必須創建庫的時候給出警告
[s] - 創建歸檔索引 (cf. ranlib)
[S] - 不要創建符號表
[T] - 產生一個簡單歸檔
[v] - 輸出較多信息
[V] - 顯示版本號
@<file> - 從 <file> 讀取選項
--target=BFDNAME - 指定目標對象格式為 BFDNAME
可選項:
--plugin <p> - 加載指定的插件程序
仿真選項:
沒有仿真特有的選項
?
庫一旦生成,我們可以檢測其可用性,main.c如下:
1 extern void foo(); 2 extern void bar(); 3 int main (void) 4 { 5 foo(); 6 bar(); 7 return 0; 8 }執行:gcc main.c libmy.a -o app
? ? ? ? ?./app
可以看到函數輸出。
ar t libmy.a ? 可以看到libmy庫的內容,(t參數,詳情man)
d參數可以刪除庫中的目標文件:
ar d libmy.a foo.o
?
?2.或許不如你所期
將上面的生成可執行文件命令做點更改:gcc main.c libmy.a -o app改成gcc libmy.a main.c -o app
居然報錯了,找不到依賴項了:
這樣可以看出,gcc對于依賴項需要從左往右指定。gcc的這種奇怪特性造成當依賴關系比較復雜時需要對同一個庫在不同的位置指定多次,否則就會出現無法成功鏈接的情形。
?
3.需要知道的小東西
-L選項用于告訴gcc從哪個目錄查找庫文件,可以多次使用它指定多個目錄;
-l(小L)選項用于告訴gcc在生成可執行程序是需要鏈接的庫名,這一選項同樣可以多次使用以指定多個庫。
使用-l選項時要注意,后面所跟名字并不包括lib前綴和.a后綴,比如上面例子中的-lmy代表指定libmy.a參與鏈接。(-l選項個人感覺有點雞肋,必須命名成lib前綴,.a后綴)
測試發現,-L和-l選項有著依賴關系,可以只是用-L選項,后面使用庫的全名,但是不能只使用-l選項,否則將出現erro。
?
轉載于:https://www.cnblogs.com/yangguang-it/p/6442119.html
總結
以上是生活随笔為你收集整理的binutils工具集之---ar的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdoj 4272 LianLianKa
- 下一篇: bootstrap在ie8下,兼容媒体查