合肥seo网站管理,中国最新军事新闻 新闻,设计办公室设计公司,wordpress导航悬浮最近重温了一下《程序员修养》#xff0c;又搞懂了一些叽里旮旯的问题#xff0c;现将DSO同名全局变量问题进行简单小结#xff0c;具体的讲解请看《程序员修养》一书。程序员的自我修养—链接、装载与库.pdf版下载在Linux公社的1号FTP服务器里#xff0c;下载地址#xf…最近重温了一下《程序员修养》又搞懂了一些叽里旮旯的问题现将DSO同名全局变量问题进行简单小结具体的讲解请看《程序员修养》一书。程序员的自我修养—链接、装载与库.pdf版下载在Linux公社的1号FTP服务器里下载地址在 2011年LinuxIDC.com\3月\程序员的自我修养—链接、装载与库程序结构为可执行文件源码main.c动态库源码Func1.cFunc2.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.5gcc 4.1.2编译成功g -g -shared -fPIC Func1.c -o libFunc1.sog -g -shared -fPIC Func2.c -o libFunc2.sog -g -L. -lFunc2 -lFunc1 -Wl,-rpath,. main.c -o main./main 输出如下Func1--22Func2--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--11Func2--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--0Func2--0没错当可执行程序中已存在同名全局对象实体则所有的动态库中的同名全局对象都会指向它。以上两种情况究其原因都是动态链接机制惹的祸具体的分析各位看官拜读一下《程序员的自我修养—链接、装载与库》吧此处只为抛砖引玉就不再班门弄斧了