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