Программа ниже демонстрирует проблему:
void f(void){}
__attribute((section("mysect"),used))
void (* const fp)(void)=&f; //const fn ptr placed in a WR segment iff compiled with -fpic AND a custom section is used
//__attribute((section("mysect2"))) int const x=42; //var stays in a RO segment even if placed in a custom section
int main()
{
extern char __start_mysect,__start_mysect2;
__start_mysect = 0; //succeeds iff the custom section is used and the program is compiled with -fpic
//I would expect (and like) a segmentation violation
/*__start_mysect2 = 0; //segfaults as expected */
}
Почему -fpic
приводит к тому, что раздел, в котором находится const funcptr, становится доступным для записи?
Мне сказали, что это из-за времени выполнения Перемещения, но без пользовательского раздела, переменная const перераспределяется во время выполнения во время загрузки, просто отлично.
Я пытаюсь использовать пользовательский раздел, чтобы я мог перебирать кучу указателей на функции const, агрегированных из разные места в одном разделе. Можно ли сделать так, чтобы раздел не стал доступным для записи?