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

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

被折叠的 条评论
为什么被折叠?



