通过链接器部分通信符号

Communicating symbols via linker sections

在C(x86linuxELF,gcc/clang)中,是否可以通过链接器use/abuse传递符号信息?例如,假设我有以下设置:

// foo.c
void a_foo_function() {...}
void b_foo_function() {...}

// bar.c
void a_bar_function() {...}
void b_bar_function() {...}
void c_bar_function() {...}

// master.c
void *array_of_function_pointers;

int main() {
    // do things with function_pointers
}

我希望 array_of_function_pointers 是一个包含指向 a_foo_functiona_bar_function 的指针的数组。通过这种方式,master.c 可以与 foo.cbar.c 中定义的函数进行交互,而无需明确了解它们。我记得之前看到过使用自定义部分(a la __attribute__((section("name")))完成此操作,但我不记得到底玩了什么把戏。

根据我的记忆,设置允许 master.c 保持不变,并且任何 child 都可以通过链接器黑魔法注册 some/all 它的功能,而无需编写太多内容,如果有的话,样板。有哪位大师有见识吗?

实现此目的的一种方法是将各个函数指针放入孤立部分(即链接描述文件未放置的部分):

您可以将这些符号 __start_NAME__stop_NAME 声明为指向指针的指针,并使用它们迭代节内容(存储在那里的指针)。

这种方法在 glibc 中用于各种目的。例如,this commit adds libio vtable verification to glibc。特殊段称为__libc_IO_vtables,开始和结束符号为__start___libc_IO_vtables__stop___libc_IO_vtables