Я выслеживаю довольно хитрую ошибку, которая произошла, когда я добавил параметр шаблона в один из моих классов. Во время инициализации он помещал статическую локальную переменную в определенный раздел памяти.
Кажется, что атрибут section GCC просто игнорируется при использовании в шаблонной функции / классе. Моя проблема звучит подобно тому, с чем столкнулся этот пользователь Тем не менее, я не вижу, что предложенное решение применимо к моему делу.
Я собрал очень простой пример, который демонстрирует это. Рассмотрим этот кусок кода:
void handler_func() { }
using handler_type = void(*)();
struct S { handler_type handler; };
template <typename T>
void templated()
{
static S __attribute__((section(".templ_section"))) __attribute__((used)) templ_instance {handler_func};
}
void free()
{
static S __attribute__((section(".free_section"))) __attribute__((used)) free_instance {handler_func};
}
struct Foo{};
int main(int argc, char** argv)
{
templated<Foo>();
free();
}
Я надеялся, что templ_instance
будет помещен в .templ_section
, а free_instance
будет помещен в .free_section
.
Однако, это расположение переменных с GCC:
0000000000000000 l O .free_section 0000000000000008 _ZZ4freevE13free_instance
0000000000000000 l d .data.rel.local._ZZ9templatedI3FooEvvE14templ_instance 0000000000000000 .data.rel.local._ZZ9templatedI3FooEvvE14templ_instance
0000000000000000 u O .data.rel.local._ZZ9templatedI3FooEvvE14templ_instance 0000000000000008 _ZZ9templatedI3FooEvvE14templ_instance
и вот что делает Clang:
0000000000000000 l O .free_section 0000000000000008 _ZZ4freevE13free_instance
0000000000000000 w O .templ_section 0000000000000008 _ZZ9templatedI3FooEvvE14templ_instance
Я не могу поверить, что это ожидаемое поведение в GCC. Есть ли способ обойти это?