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同名全局变量浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java下文_java实现文件下载的两种
- 下一篇: 定时器中断实验 编写程序使定时器0或者