C 通过链接器部分传送符号
在C(x86 linux ELF,gcc/clang)中,是否可以通过链接器的使用/滥用来传递符号信息?例如,假设我有以下设置:C 通过链接器部分传送符号,c,gcc,linker,attributes,sections,C,Gcc,Linker,Attributes,Sections,在C(x86 linux ELF,gcc/clang)中,是否可以通过链接器的使用/滥用来传递符号信息?例如,假设我有以下设置: // 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_o
// 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\u of_function\u指针
是一个数组,包含指向a_foo\u函数
和a_bar\u函数
的指针。通过这种方式,master.c
可以与foo.c
和bar.c
中定义的函数交互,而无需明确了解它们。我记得以前看到过通过使用自定义节(la\uuuu属性((节(“名称”))
)来实现这一点,但我记不清到底玩了什么把戏
据我记忆所及,设置允许
master.c
保持不变,任何子级都可以通过链接器黑魔法注册它的部分/所有函数,而不必编写太多(如果有的话)样板。任何专家都有一些见解?实现这一点的一种方法是将单个函数指针放入孤立部分(即,未由链接器脚本放置的节):
- 以及
这种方法在glibc中用于各种目的。例如,特殊部分称为
\u libc\u IO\u vtables
,启动和停止符号是\u start\u libc\u IO\u vtables
和\u stop\u libc\u IO\u vtables
实现这一点的一种方法是将单个函数指针放入孤立部分(即,未由链接器脚本放置的节):
- 以及
这种方法在glibc中用于各种目的。例如,特殊部分称为
\u libc\u IO\u vtables
,启动和停止符号是\u start\u libc\u IO\u vtables
和\u stop\u libc\u IO\u vtables
,我想将它放在函数指针填充有函数的地方a_-bar_函数
。请你重新表述一下好吗?你的意思不清楚。我试着重新表述这个问题。如果仍然不清楚,请告诉我。我想知道函数指针中填充了a_-foo_函数
和a_-bar_函数
。你能重新表述一下吗?不清楚你的意思。我试过了重新表述问题。如果仍然不清楚,请告诉我。谢谢,拼图中缺失的部分是访问节指针。谢谢,拼图中缺失的部分是访问节指针。