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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux内核全局变量同名,Linux系统下DSO同名全局变量浅析

發布時間:2025/3/12 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核全局变量同名,Linux系统下DSO同名全局变量浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近重溫了一下《程序員修養》,又搞懂了一些嘰里旮旯的問題,現將DSO同名全局變量問題進行簡單小結,具體的講解請看《程序員修養》一書。

程序員的自我修養—鏈接、裝載與庫.pdf版下載在Linux公社的1號FTP服務器里,下載地址:

在 2011年LinuxIDC.com\3月\程序員的自我修養—鏈接、裝載與庫

程序結構為可執行文件源碼main.c,動態庫源碼Func1.c,Func2.c,代碼如下:

#include

extern void Func1();

extern void Func2();

extern int g_var;

int main()

{

Func1();

Func2();

return 0;

}

#include

int g_var = 11;

void Func1()

{

printf("Func1-->%d\n",g_var);

}

#include

int g_var = 22;

void Func2()

{

printf("Func2-->%d\n",g_var);

}

在CentOS5.5+gcc 4.1.2編譯成功

g++ -g -shared -fPIC Func1.c -o libFunc1.so

g++ -g -shared -fPIC Func2.c -o libFunc2.so

g++ -g -L. -lFunc2 -lFunc1 -Wl,-rpath,. main.c -o main

./main 輸出如下

Func1-->22

Func2-->22

為什么呢?

g++ -g -L. -lFunc2 -lFunc1-Wl,-rpath,. main.c -o main

因為動態鏈接器是先將Func2.so鏈接到進程虛擬空間,如果將編譯命令變為

g++ -g -L. -lFunc1 -lFunc2-Wl,-rpath,. main.c -o main

則輸出變為:

Func1-->11

Func2-->11

由此說明,不論進程所鏈接的動態庫中有多少同名的全局變量,在進程虛擬空間內只有一份變量實體,所有的同名變量都會指向此實體,因此Func1.so和Func2.so中的g_var值是一致的。

再來修改一下main.c:

#include

extern void Func1();

extern void Func2();

int g_var;

int main()

{

Func1();

Func2();

return 0;

}

程序輸出是什么呢?

Func1-->0

Func2-->0

沒錯,當可執行程序中已存在同名全局對象實體,則所有的動態庫中的同名全局對象都會指向它。

以上兩種情況,究其原因,都是動態鏈接機制惹的禍,具體的分析各位看官,拜讀一下《程序員的自我修養—鏈接、裝載與庫》吧,此處只為拋磚引玉,就不再班門弄斧了!

總結

以上是生活随笔為你收集整理的linux内核全局变量同名,Linux系统下DSO同名全局变量浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

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