Visual c++ 设置数据_seg的节属性

Visual c++ 设置数据_seg的节属性,visual-c++,arm,Visual C++,Arm,当编译器找到静态初始值设定项时,它会将其放在一个特殊的部分中。节的名称类似于“.CRT$XCU”。链接器将按节名称的字母顺序查找所有节 当我想要实现初始化功能时。为此,我将介绍两个部分: typedef void(*PVF)(); #pragma data_seg(".CRT$XAA") PVF _init_begin[] = { 0 }; #pragma data_seg(".CRT$XZZ") PVF _init_end[] = { 0 }; 当链接器正确排序节时,将有一个指针指向\u

当编译器找到静态初始值设定项时,它会将其放在一个特殊的部分中。节的名称类似于“.CRT$XCU”。链接器将按节名称的字母顺序查找所有节

当我想要实现初始化功能时。为此,我将介绍两个部分:

typedef void(*PVF)();

#pragma data_seg(".CRT$XAA")
PVF _init_begin[] = { 0 };

#pragma data_seg(".CRT$XZZ")
PVF _init_end[] = { 0 };
当链接器正确排序节时,将有一个指针指向
\u init\u begin
\u init\u end
之间的初始值设定项

问题是创建的节具有属性
0xc030040
,即可能存在写入/读取/执行访问。但是编译器发出带有属性
0x40300040
的“.CRT$XCU”部分。这会导致链接器将节放置在一起

我已尝试使用以下pragma定义该节:

#pragma section(".CRT$XAA",execute,read)
但这不会在.obj文件中创建任何节“.CRT$XAA”

如何创建具有所需属性的节

typedef int (__cdecl* _PIFV)(void);

#pragma section(".ABC$XAA", long, read)
#pragma section(".ABC$XZZ", long, read)

__declspec(allocate(".ABC$XAA")) _PIFV init_begin = { 0 };
__declspec(allocate(".ABC$XZZ")) _PIFV init_end   = { 0 };
不应将初始值设定项标记为可执行文件。您只存储指向函数的指针,而不是实际函数。函数指针不需要是可执行的


请注意,实际的CRT初始值设定项部分(int
.CRT
)没有文档化的实现细节,可能会随时更改。

为什么在使用
数据时将其全部放在
“.CRT$XCU”
组中?这是我在回答中想知道的