通过链接器部分通信符号
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_function
和 a_bar_function
的指针的数组。通过这种方式,master.c
可以与 foo.c
和 bar.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
。
在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_function
和 a_bar_function
的指针的数组。通过这种方式,master.c
可以与 foo.c
和 bar.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
。