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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

利用gcc的__attribute__编译属性section子项构建初始化函数表【转】

發布時間:2025/3/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:https://my.oschina.net/u/180497/blog/177206

gcc的__attribute__編譯屬性有很多子項,用于改變作用對象的特性。這里討論section子項的作用。__attribute__的section子項使用方式為:__attribute__((section("section_name")))其作用是將作用的函數或數據放入指定名為"section_name"的段。看以下程序片段:#include <unistd.h> #include <stdint.h> #include <stdio.h>typedef void (*myown_call)(void);extern myown_call _myown_start; extern myown_call _myown_end;#define _init __attribute__((unused, section(".myown"))) #define func_init(func) myown_call _fn_##func _init = funcstatic void mspec1(void) {write(1, "aha!\n", 5); }static void mspec2(void) {write(1, "aloha!\n", 7); }static void mspec3(void) {write(1, "hello!\n", 7); }func_init(mspec1); func_init(mspec2); func_init(mspec3);/* exactly like below: static myown_call mc1 __attribute__((unused, section(".myown"))) = mspec1; static myown_call mc2 __attribute__((unused, section(".myown"))) = mspec2; static myown_call mc3 __attribute__((unused, section(".myown"))) = mspec3; */void do_initcalls(void) {myown_call *call_ptr = &_myown_start;do {fprintf (stderr, "call_ptr: %p\n", call_ptr);(*call_ptr)();++call_ptr;} while (call_ptr < &_myown_end);}int main(void) {do_initcalls();return 0; }在自定義的.myown段依次填入mspec1/mspec2/mspec3的函數指針,并在do_initcalls中依次調用,從而達到構造并調用初始化函數列表的目的。兩個extern變量:extern myown_call _myown_start; extern myown_call _myown_end;來自ld的鏈接腳本,可以使用:ld --verbose獲取內置lds腳本,并在:__bss_start = .;之前添加以下內容:_myown_start = .;.myown : { *(.myown) } = 0x90000000_myown_end = .;code_segment : { *(code_segment) }即定義了.myown段及_myown_start/_myown_end變量(0x90000000這個數值可能需要調整)。保存修改后的鏈接器腳本,假設程序為s.c,鏈接器腳本保存為s.lds,使用以下命令編譯:gcc s.c -Wl,-Ts.lds執行結果:[root@localhost ]# ./a.out call_ptr: 0x8049768 aha! call_ptr: 0x804976c aloha! call_ptr: 0x8049770 hello!Have Fun! ? 著作權歸作者所有

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的利用gcc的__attribute__编译属性section子项构建初始化函数表【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

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