dll多次实例化静态变量共享问题(linux,windows)

本文探讨了在Windows和Linux下,DLL或动态链接库中静态变量多次实例化的问题,以及如何通过编译参数实现静态变量的共享。详细介绍了Windows下利用#pragma data_seg和链接器命令行选项/SECTION来创建和共享数据节,以及Linux下通过-rdynamic选项暴露符号表。同时,文章提出了插件设计时避免依赖主程序全局变量的建议,以保证插件的独立性和安全性。

dll多次实例化时,系统会为每个实例分配独立的内存空间,静态变量也不例外,要想多个dll实例共用同一静态变量,目前查到最好的方法是通过编译参数,实现这个目的。Linux和Windows下均有各自的方法。

以下是我觉得比较好的两篇文章,附上出处,由于是简单拷贝,失去了原文格式,建议去看原文。

声明:由于同时转载了两篇文章,若发布类型选择转载只能填写一个转载链接,故发布类型选择原创,本文章实为转载,请支持原创。

Windows下实现:

版权声明:本文为CSDN博主「zslInSz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyyzsl212328/article/details/8054047

为防止原文失效,以下是转载的文章内容,由于是简单拷贝,失去了原文格式,建议去看原文。

————————————————————————————————

全局数据和静态数据不能被同一个. e x e或D L L文件的多个映像共享,这是个安全的默认设置。但是,在某些情况下,让一个. e x e文件的多个映像共享一个变量的实例是非常有用和方便的。例如,Wi n d o w s没有提供任何简便的方法来确定用户是否在运行应用程序的多个实例。但是,如果能够让所有实例共享单个全局变量,那么这个全局变量就能够反映正在运行的实例的数量。当用户启动应用程序的一个实例时,新实例的线程能够简单地查看全局变量的值(它已经被另一个实例更新);如果这个数量大于1,那么第二个实例就能够通知用户,该应用程序只有一个实例可以运行,而第二个实例将终止运行。

 

每个. e x e或D L L文件的映像都由许多节组成。按照规定,每个标准节的名字均以圆点开头。例如,当编译你的程序时,编译器会将所有代码放入一个名叫. t e x t的节中。该编译器还将所有未经初始化的数据放入一个. b s s节,而已经初始化的所有数据则放入. d a t a节中。

每一节都拥有与其相关的一组属性,这些属性如表1 7 - 1所示。

表17-1 .exe或D L L文件各节的属性

属性    含义
R E A D    该节中的字节可以读取
W R I T E    该节中的字节可以写入
E X E C U T E    该节中的字节可以执行
S H A R E D    该节中的字节可以被多个实例共享(本属性能够有效地关闭c o p y - o n - w r i t e机制)
使用M i c r o s o f t的Visual Studio的D u m p B i n实用程序(带有/ H e a d e r s开关),可以查看. e x e或D L L映射文件中各个节的列表。下面选录的代码是在一个可执行文件上运行D u m p B i n程序而生成的:

SECTION HEADER #1
   .text name
   11A70 virtual size
    1000 virtual address
   12000 size of raw data
    1000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

SECTION HEADER #2
  .rdata name
     1F6 virtual size
   13000 virtual address
    1000 size of raw data
   13000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

SECTION HEADER #3
   .data name
     560 virtual size
   14000 virtual address
    1000 size of raw data
   14000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write

SECTION HEADER #4
  .idata name
     58D virtual size
   15000 virtual address
    1000 size of raw data
   15000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write

SECTION HEADER #5
  .didat name
     7A2 virtual size
   16000 virtual address
    1000 size of raw data
   16000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
       

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值