fangyukuan

永无止境的追求...追求卓越!!!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  94 随笔 :: 0 文章 :: 127 评论 :: 96万 阅读

fangyukuan

2010.7.11

全局数据和静态数据不能被同一个. exeDLL文件的多个映像共享,这是个安全的默认设置。但是,在某些情况下,让一个. exe文件的多个映像共享一个变量的实例是非常有用和方便的.

每个. exeDLL文件的映像都由许多节组成。按照规定,每个标准节的名字均以圆点开头。

       每一节都拥有与其相关的一组属性

exeDLL文件各节的属性

属性

含义

READ

该节中的字节可以读取

WRITE

该节中的字节可以写入

EXECUTE

该节中的字节可以执行

SHARED

该节中的字节可以被多个实例共享(本属性能够有效地关闭copy-on-write机制)

 

常见的节名及作用

节名

作用

.bss

未经初始化的数据

.CRT

C运行期只读数据

.data

已经初始化的数据

.debug

调试信息

.didata

延迟输入文件名表

.edata

输出文件名表

.idata

输入文件名表

.rdata

运行期只读数据

.reloc

重定位表信息

.rsrc

资源

.text

. e x eD L L文件的代码

.tls

线程的本地存储器

.xdata

异常处理表

怎么查看这些节 

可以用使用:Microsoft的Visual Studio的DumpBin实用程序

有一个更方便的工具:eXeScope.exe

 

怎么创建自己的节并让多个实例共享数据

  1. 自定义一个节
  2. 把变量放到自定义节中
  3. 注意变量要初始化。
  4. 告诉链接程序,某个节中的变量是需要加以共享的

如下:

#pragma comment(linker, "/SECTION:Shared,RWS")

#pragma data_seg("Shared")

long g_nCount1 = 0;

#pragma data_seg()

 

也可以用allocate把某变量加入到自定义节中,如下

__declspec(allocate("Shared")) long g_nCount3 = 0;

 

复制代码
#include "stdafx.h"
#include
"stdlib.h"
#include
<iostream>
using namespace std;

#pragma comment(linker, "/SECTION:Shared,RWS") // 告诉链接程序,某个节中的变量是需要加以共享的

#pragma data_seg("Shared") // 创建一个称为“Shared”的节
long g_nCount1 = 0;
long g_nCount2;
#pragma data_seg()

// 也可以用allocate把某变量加入到自定义节中
__declspec(allocate("Shared")) long g_nCount3 = 0;

int _tmain(int argc, _TCHAR* argv[])
{
cout
<< "g_nCount1: " << ++g_nCount1 << " // 有初始化, 有加到自定义节中" << endl;
cout
<< "g_nCount2: " << ++g_nCount2 << " // 没有初始化,没有加到自定义节中" << endl;
cout
<< "g_nCount3: " << ++g_nCount3 << " // 利用__declspec(allocate(\"Shared\")) 把变量加到自定义节中" << endl;

system(
"pause");
return 0;
}
复制代码

 

多次运行本例子:可以看到g_nCount1和g_nCount3在递增,而g_nCount2保持不变。

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/07/11/1775277.html

 

posted on   fangyukuan  阅读(1967)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示