下面的程序演示了这个问题:
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 函数指针。我可以这样做而不导致该部分变得可写吗?