设置 data_seg 的部分属性

Set the section attributes for data_seg

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

当我要实现初始化函数的时候。为此,我介绍了两个部分:

typedef void(*PVF)();

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

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

当链接器对节进行正确排序时,_init_begin_init_end 之间将有一个指向初始化程序的指针。

问题是这些部分是使用属性 0xC0300040 创建的,即可以 write/read/execute 访问。但是编译器发出带有属性 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) 未记录实现细节,可能随时更改。