设为首页 加入收藏

TOP

Linux系统下DSO同名全局变量浅析
2014-11-24 07:48:47 来源: 作者: 【 】 浏览:1
Tags:Linux 系统 DSO 同名 全局 变量 浅析

最近重温了一下《程序员修养》,又搞懂了一些叽里旮旯的问题,现将DSO同名全局变量问题进行简单小结,具体的讲解请看《程序员修养》一书。


程序员的自我修养—链接、装载与库.pdf版下载在Linux公社的1号FTP服务器里,下载地址:


密码:www.muu.cc


在 2011年LinuxIDC.com\3月\程序员的自我修养—链接、装载与库


下载方法见 http://www.linuxidc.net/thread-1187-1-1.html


程序结构为可执行文件源码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;


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


没错,当可执行程序中已存在同名全局对象实体,则所有的动态库中的同名全局对象都会指向它。


以上两种情况,究其原因,都是动态链接机制惹的祸,具体的分析各位看官,拜读一下《程序员的自我修养—链接、装载与库》吧,此处只为抛砖引玉,就不再班门弄斧了!


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android SDK 源代码编译 下一篇Android 往 Framework中添加新的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)