日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

__attribute__ 之weak,alias属性

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 __attribute__ 之weak,alias属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Weak Alias 跟 Weak Reference 完全沒有任何關系,不過是我在看到 Weak Reference 的時候想到的而已。

Weak Alias 是 gcc 擴展里的東西,實際上是函數的屬性。這個東西在庫的實現里面可能會經常用到,比如 glibc 里面就用了不少。抄錄一段?gcc 手冊里面的話解釋下函數屬性是干啥的,

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。給函數加上weak屬性時,即使函數沒定義,函數被調用也可以編譯成功。

00000000 T __foo 00000000 W foo U puts

而 alias 則使?foo?是?__foo?的一個別名,__foo 和 foo 必須在同一個編譯單元中定義,否則會編譯出錯。

那么這個東西的用處是?

看第二個文件,func.c,

#include?int foo() {?puts(”I do something.”); }

這里有一個函數名字是?foo如果我們編譯 func.c 和 dummy.c 得到兩個目標文件,當我們同時使用 func.o 和 dummy.o 和其他目標文件進行鏈接時,如果其他目標文件里面引用符號?foo,最終使用到的是 func.c 中定義的函數,而不是?__foo,雖然它有一個別名?foo也就是說,我們最終使用到的函數會是“實際做事”的那個函數。當然,單獨使用 dummy.o 鏈接的話使用的是那個“不做事”的函數如果 dummy.o 中的?foo?不是 weak symbol 的話,在鏈接時會產生沖突,這就是我們要使用 weak 的原因

glibc 的實現里面經常用 weak alias。比如它的?socket?函數,在 C 文件里面你會看到一個?__socket?函數,它幾乎什么都沒有做,只是設置了一些錯誤代碼,返回些東西而已。在同一個 C 文件里面會再聲明一個__socket?的 weak alias 別名?socket。實際完成工作的代碼通過匯編來實現,在另外的匯編文件里面會有設置系統調用號,執行?sysenter?或者?int?等動作去請求系統調用。以前看 glibc 里面系統調用的實現的時候郁悶過很久,就是那個時候才知道了 weak alias 這個東西。

總結

以上是生活随笔為你收集整理的__attribute__ 之weak,alias属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。