打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux系统下DSO同名全局变量浅析

程序结构为可执行文件源码main.c,动态库源码Func1.c,Func2.c,代码如下:   

    #include <stdio.h>

    extern void Func1();
    extern void Func2();

    extern int g_var;

    int main()
   {
        Func1();
        Func2();
  
        return 0;
   }

  

   #include <stdio.h>

   int g_var = 11;

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

   #include <stdio.h>

   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 <stdio.h>

    extern void Func1();
    extern void Func2();

    int g_var;

    int main()
   {
        Func1();
        Func2();
  
        return 0;
   }

   程序输出是什么呢?

   Func1-->0
   Func2-->0

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言正确使用extern关键字
C语言总结
C语言中的强符号与弱符号
在头文件中定义全局变量
一篇文章带你了解Go语言基础之变量
C++比C牛逼的七个点
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服