gpt4 book ai didi

c++ - dlopen'ing 时是否运行静态初始化(和/或其他)代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 25 4
gpt4 key购买 nike

当您 dlopen() 一个共享对象时,是否有一种机制可以让该 DLL 中的代码在不显式调用的情况下执行?具体来说,dlopen() 的调用者可能不知道的全局变量/静态变量的 C++ 静态初始化代码?我很确定答案应该是"is",但我不记得是什么机制使它发生,以及如何利用它来运行任意代码。

最佳答案

是的:dlopen 遵循在加载时运行代码的 ELF 二进制格式机制。

实际上有两种这样的机制:

  • 旧版本使用特殊的 .init.fini 部分,其中包含用于 dlopen 的函数指针数组dlclose 调用。由于这些部分在运行时可能不存在,因此还有指向相应部分的 DT_INITDT_FINI 动态标记。
  • 较新的机制是.init_array.fini_array以及相应的DT_INIT_ARRAYDT_INIT_ARRAYSZDT_FINI_ARRAY DT_FINI_ARRAYSZ 动态标签。

描述了两种机制之间的差异here .

上升到源代码级别,如果您使用 __attribute__((constructor)) 修饰 C 函数,编译器将使用这两种机制之一使其在对象为 dlopened。需要动态初始化的全局 C++ 对象的构造代码也是如此。

关于c++ - dlopen'ing 时是否运行静态初始化(和/或其他)代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39540364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com