GNU C – 一個別緻的HelloWorld程式 引申到: __attribute__((constructor)|(destructor)(PRIORITY))

來源:互聯網
上載者:User

在前面的<<程式員的自我修養 連結 裝載與庫>>關於object files的內容中,有看到使用自訂段的部分內容,

(如果關於object files的內容不瞭解的話,可以去參考<<程式員的自我修養 連結 裝載與庫>>這本書或者去wiki,

其中也有關於段的解釋,也可以稱作節區.) 可以通過寫入程式碼實現自訂段.

__attribute__  ((section("name")))   .....

 

編譯產生的object file,代碼會儲存在".text"段,全域變數和靜態變數會放在".data"和".bss"(未初始化的全域變數和局部靜態變數)

利用GCC的擴充機制就可以做到自訂段了.

 

對[ __attribute__ ] 高度興趣,下面來看一個不一樣的HelloWorld程式:

#include <stdio.h>#include <stdlib.h>static  __attribute__((constructor)) void before(){printf("Hello");}static  __attribute__((destructor)) void after(){printf(" World!\n");}int main(int args,char ** argv){return EXIT_SUCCESS;}

 我們知道這是一個HelloWorld程式,所以輸出的結果就是"Hello World!",很簡單,不需要對這點過多關心.

下面我們來關心關心別的:

__attribute__((constructor))__attribute__((destructor))

 解釋一下:__attribute__((constructor)) 在main() 之前執行,__attribute__((destructor)) 在main()執行結束之後執行.

上面的例子中我沒有在main函數中添加任何的輸出,所以看不到具體的資訊.這點可以自己嘗試~

 

如果要在main()之前或者是執行完成之後,需要執行很多的前處理動作或者是後處理動作,我們應該怎麼處理?

也許,你需要下面這些東西:

__attribute__((constructor(PRIORITY)))__attribute__((destructor(PRIORITY)))

 PRIORITY: 優先順序.

好吧,下面就來試試:

執行的輸出如下:

 從輸出的資訊看,前處理都是按照優先順序先後執行的,而後處理則是相反的,好吧,我們使用GDB調實驗證一下:

 

 從調試的資訊也是驗證了上面的結果.

 

另外一個問題,優先順序有沒有範圍的?

其實剛開始我寫的程式中的優先順序是1,我們將上面的程式改一下,然後編譯看一下會有什麼樣的結果:

 

 

 0-100(包括100),是內部保留的,所以在編碼的時候需要注意.

 

關於__attribute__的用法,可以有另外一種寫法,先聲明函數,然後再定義.

 

 glibc多採用第一種寫法.

 

外面又下雨了~ Cause i am ur lady, u are my man. 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.