__attribute__ 之weak,alias属性
Weak Alias 跟 Weak Reference 完全沒有任何關系,不過是我在看到 Weak Reference 的時候想到的而已。
Weak Alias 是 gcc 擴展里的東西,實際上是函數(shù)的屬性。這個東西在庫的實現(xiàn)里面可能會經常用到,比如 glibc 里面就用了不少。抄錄一段?gcc 手冊里面的話解釋下函數(shù)屬性是干啥的,
In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your code more carefully.
先上代碼,看看 weak alias 怎么寫。第一個文件 dummy.c 內容,
#include int __foo() {?puts(”I do?no thing.”); }?int foo()?__attribute__ ((weak,alias(”__foo”))); weak 和 alias 分別是兩個屬性。weak 使得?foo?這個符號在目標文件中作為 weak symbol 而不是 global symbol。用?nm?命令查看編譯 dummy.c 生成的目標文件可用看到?foo 是一個 weak symbol,它前面的標記是 W。給函數(shù)加上weak屬性時,即使函數(shù)沒定義,函數(shù)被調用也可以編譯成功。
 
而 alias 則使?foo?是?__foo?的一個別名,__foo 和 foo 必須在同一個編譯單元中定義,否則會編譯出錯。
那么這個東西的用處是?
看第二個文件,func.c,
#include?int foo() {?puts(”I do something.”); }這里有一個函數(shù)名字是?foo。如果我們編譯 func.c 和 dummy.c 得到兩個目標文件,當我們同時使用 func.o 和 dummy.o 和其他目標文件進行鏈接時,如果其他目標文件里面引用符號?foo,最終使用到的是 func.c 中定義的函數(shù),而不是?__foo,雖然它有一個別名?foo。也就是說,我們最終使用到的函數(shù)會是“實際做事”的那個函數(shù)。當然,單獨使用 dummy.o 鏈接的話使用的是那個“不做事”的函數(shù)。如果 dummy.o 中的?foo?不是 weak symbol 的話,在鏈接時會產生沖突,這就是我們要使用 weak 的原因。
glibc 的實現(xiàn)里面經常用 weak alias。比如它的?socket?函數(shù),在 C 文件里面你會看到一個?__socket?函數(shù),它幾乎什么都沒有做,只是設置了一些錯誤代碼,返回些東西而已。在同一個 C 文件里面會再聲明一個__socket?的 weak alias 別名?socket。實際完成工作的代碼通過匯編來實現(xiàn),在另外的匯編文件里面會有設置系統(tǒng)調用號,執(zhí)行?sysenter?或者?int?等動作去請求系統(tǒng)調用。以前看 glibc 里面系統(tǒng)調用的實現(xiàn)的時候郁悶過很久,就是那個時候才知道了 weak alias 這個東西。
總結
以上是生活随笔為你收集整理的__attribute__ 之weak,alias属性的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: X210烧写linux系统
- 下一篇: 陕西一公司直播员工上班过程 律师:或侵犯
