将模板类的静态const成员放在GCC的特定部分中

时间:2018-11-15 17:21:35

标签: c++ gcc clang sections

对于自定义构建步骤,我需要将一些数据放入特定部分。在GCC和clang上,可以使用

__attribute__((section(".my_section"))) const int variable_in_this_section = 42;

为了简化创建过程并减少错误发生,我创建了一个模板类:

#include <cstdint>

#ifdef _MSC_VER
    #define SECTION(x) __declspec(section x)
#else
    #define SECTION(x) __attribute__((section(x)))
#endif

#define DATA_SECTION SECTION(".my_data")

// the type to store in the .my_data section
struct hook_table_entry_t
{
    std::uint32_t game_addr, hook_addr;
};

template<std::uint32_t address, std::uint32_t function>
struct bind_hook_t
{
    DATA_SECTION static const hook_table_entry_t s_entry;
};
template<std::uint32_t address, std::uint32_t function>
const hook_table_entry_t bind_hook_t<address, function>::s_entry {address, function};

// instantiate template to create value
template struct bind_hook_t<0xffffffff, 0xf0f0f0f0>;

当我用clang 3.8编译时,我的目标文件看起来像这样:

Section .my_data:
0000 ffffffff f0f0f0f0                    ........        

完美!但是在GCC 5和7中进行测试时,我得到了:

Section .rodata._ZN11bind_hook_tILj4294967295ELj4042322160EE7s_entryE:
0000 ffffffff f0f0f0f0                    ........        

是否有一种方法可以使GCC还将数据放入.my_data中?注意:当bind_hook_t不是模板时,它就可以工作,但是却违背了它的全部目的。

0 个答案:

没有答案