3

下面的程序演示了这个问题:

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 函数指针。我可以这样做而不导致该部分变得可写吗?

4

0 回答 0