动态链接库(.dll,.so等)是否有入口点?

5
今天我参与了一个关于库没有入口点的讨论。一般来说,可执行文件会加载库并将其入口点指向可执行程序中的main函数。 那么是否有例外情况,使得库本身可以有入口点呢? 更新: @sgr91解释说在Windows中DllMain是入口点!Linux呢?或者这只是Windows的一个特性?

1
DLL中的入口点是可选的。函数DllMain是DLL的入口点。如果您想在DLL加载时进行一些初始工作,可以创建该函数,否则可以跳过它。 - sgarizvi
@sgar91,您能详细说明一下“dll加载的初始工作”是什么意思吗?这对我理解很有帮助 :) - sp497
抱歉,我对 Linux 的了解不是很多。 - sgarizvi
3
在Linux上,有_init和_fini节,指向在加载/卸载时运行的函数。与Windows中DllMain的DLL_PROCESS_ATTACH / DLL_PROCESS_DETACH大致具有相同的功能。 - Anton Kovalenko
@AntonKovalenko,关于QNX平台有什么线索吗? - parasrish
显示剩余2条评论
1个回答

2
是的,动态库确实有入口点。 它可能有不同的名称(可能会或不会暴露供使用),这取决于编译器和操作系统。
对于Linux:
void __attribute__ ((constructor)) my_init(void);

void __attribute__ ((destructor)) my_fini(void);

"_init"和"_fini"部分现已过时。

阅读更多


1
@yugr 这与此无关。 - Johan Boulé
1
@yugr,你似乎混淆了这两个不相关的概念。库入口点没有标准化,因此您必须使用非标准定义。当您动态加载或卸载库时,将调用这些函数(有点像程序的主入口点)。对象及其构造函数/析构函数在这个图像中的位置在哪里?它们不在其中。如果您认为可以获得相同的结果,请向我展示一些静态对象的等效技术。 - Johan Boulé
@JohanBoulé:“对象和它们的构造函数/析构函数在这个画面中的位置是什么” - 通过允许人们编写可移植的(反)初始化程序,而不需要使用编译器扩展... - yugr
@JohanBoulé 他们肯定是在Linux上,但我读到他们不被称为DLL。这使得我上面的评论不正确。 - yugr
@yugr 嗯,这至少让你在 Linux 上的评论变得相关了 :) 你教会了我一些新东西。 - Johan Boulé
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接