'Why function pointer in the structure causes relocation at program load-time

I've the following code that I compile and run on Linux:

#include <stdio.h>

// can't be static
void do_stuff(void) {
    ;;
}

typedef void (*func)(void);

struct data {
    func ptr;
};

static const struct data d = {
    .ptr = do_stuff
};

int main() {
    d.ptr();
}

If I compile it:

gcc -O0 -o main main.c

then d goes to .data.rel.ro segment.

objdump -t main | grep ".data.rel.ro"
0000000000003df8 l    d  .data.rel.ro   0000000000000000              .data.rel.ro
0000000000003df8 l     O .data.rel.ro   0000000000000008              d

I understand that reason for it is a relocation done by loader and that's because of function pointer in the "data" structure.

What I don't get is - why it is done like that? What is a reason for having relocation here?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source