【问题标题】:Set the section attributes for data_seg设置 data_seg 的部分属性
【发布时间】:2015-09-18 17:15:37
【问题描述】:

当编译器找到一个静态初始化器时,它会将它放在一个特殊的部分中。该部分的名称类似于“.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 创建的,即可以进行写/读/执行访问。但是编译器会发出带有属性0x40300040 的部分“.CRT$XCU”。这会导致链接器将这些部分放在一起。

我已经尝试使用这个 pragma 定义该部分:

#pragma section(".CRT$XAA",execute,read)

但这不会在 .obj 文件中创建任何部分“.CRT$XAA”。

如何创建具有所需属性的部分?

【问题讨论】:

    标签: visual-c++ arm


    【解决方案1】:
    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) 没有记录在案的实现细节,并且可能随时更改。

    【讨论】:

    • 为什么在使用data_seg时把它全部放在".CRT$XCU"组中是我想在这个答案中知道的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多