【问题标题】:Do dynamic linked libraries(.dll,.so etc) have an entry point?动态链接库(.dll、.so 等)是否有入口点?
【发布时间】:2012-12-31 19:24:51
【问题描述】:

今天我在讨论库没有入口点。通常可执行文件加载库,入口点是可执行文件本身的主要点。

是否存在库本身可以有入口点的例外情况??

更新:

@sgr91 解释说 DllMain 是 Windows 的入口点! linux 呢?还是只是 Windows 的一个功能?

【问题讨论】:

  • DLL 中的入口点是可选的。函数DllMain 是DLL 的入口点。如果你想对 DLL 加载做一些初步的工作,你可以创建函数,否则你可以跳过它。
  • @sgar91 您能否详细说明“dll 加载的初始工作”是什么意思?这对我理解会有帮助:)
  • 例如你想在加载 DLL 时调用一个特定的函数,你可以在 DLLMain 中调用该函数。尽管非常不鼓励在 DllMain 中调用外部函数。
  • 对不起,我对 Linux 了解不多。
  • @sgar91 在 Linux 上,有 _init 和 _fini 部分,指向在加载/卸载时运行的函数。与DLL_PROCESS_ATTACH/DLL_PROCESS_DETACHDllMain 的功能大致相同。

标签: dll shared-libraries dynamic-linking entry-point


【解决方案1】:

是的,动态库确实有入口点。 根据compiler 和操作系统,它可能会以不同的方式命名(可能会或可能不会公开以供使用)。

对于 Linux:

void 属性 ((constructor)) my_init(void);

void 属性 ((destructor)) my_fini(void);

_init_fini 部分现已过时。

阅读more

【讨论】:

  • @yugr 这无关。
  • @JohanBoulé 你的意思是建议使用标准语言机制而不是自定义编译器扩展是无关的?
  • @yugr 您似乎混淆了这两个不相关的概念。库入口点没有标准化,因此您必须使用非标准定义。当您动态加载或卸载库时,会调用这些函数(有点像程序的主入口点)。对象及其 ctors/dtors 在哪里适合这张图片?他们没有。如果您认为可以获得相同的结果,请向我展示一些与静态对象等效的技术。
  • @JohanBoulé “对象及其 ctors/dtors 在哪里适合这张图片” - 通过允许人们编写可移植(反)初始化程序而不求助于编译器扩展......
  • @yugr 你是在暗示一个库的静态对象被销毁/释放(并且,IF C++ 被使用,他们的 dtor 被调用),当我们调用 dlclose/FreeLibrary 来卸载它时?我可能会在 dlopen/LoadLibrary 返回之前购买您关于静态初始化讨论场所的论点,但是卸载呢?
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 2013-07-24
  • 2014-07-22
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多