C 通过链接器部分传送符号

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

在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_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_函数
。你能重新表述一下吗?不清楚你的意思。我试过了重新表述问题。如果仍然不清楚,请告诉我。谢谢,拼图中缺失的部分是访问节指针。谢谢,拼图中缺失的部分是访问节指针。