设置 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
) 未记录实现细节,可能随时更改。
当编译器找到一个静态初始值设定项时,它会将它放在一个特殊的部分中。该部分的名称类似于“.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
) 未记录实现细节,可能随时更改。