C++ dlopen';时是否运行静态初始化(和/或其他)代码;惯性导航与制导?

C++ dlopen';时是否运行静态初始化(和/或其他)代码;惯性导航与制导?,c++,dlopen,shared-objects,dynamic-loading,static-initialization,C++,Dlopen,Shared Objects,Dynamic Loading,Static Initialization,当您dlopen()一个共享对象时,是否有一种机制可以让DLL中的代码在不被显式调用的情况下执行?具体而言,C++(代码)> DLUN()/调用方的全局/静态静态初始化代码可能不知道。我很确定答案应该是“是”,但我不记得是什么机制导致了这种情况,以及如何利用它来运行任意代码。是:dlopen尊重一种ELF二进制格式机制,用于在加载时运行代码 实际上有两种机制: 旧版本使用特殊的.init和.finis节,其中包含用于调用dlopen和dlclose的函数指针数组。由于节在运行时可能不存在,因此

当您
dlopen()
一个共享对象时,是否有一种机制可以让DLL中的代码在不被显式调用的情况下执行?具体而言,C++(代码)> DLUN()/<代码>调用方的全局/静态静态初始化代码可能不知道。我很确定答案应该是“是”,但我不记得是什么机制导致了这种情况,以及如何利用它来运行任意代码。

是:
dlopen
尊重一种ELF二进制格式机制,用于在加载时运行代码

实际上有两种机制:

  • 旧版本使用特殊的
    .init
    .fini
    s节,其中包含用于调用
    dlopen
    dlclose
    的函数指针数组。由于节在运行时可能不存在,因此还有指向相应节的
    DT_INIT
    DT_FINI
    动态标记
  • 较新的机制是
    .init\u数组
    .fini\u数组
    以及相应的
    DT\u init\u数组
    DT\u init\u数组
    DT\u fini\u数组
    动态标记
描述了这两种机制之间的区别


转到源代码级别,如果您使用
\uuuuu attribute\uuuu((构造函数))
装饰C函数,编译器将使用这两种机制中的一种,使其在对象为“代码> DLOpen< /COD> EDE时运行。对于需要动态初始化的全局C++对象的构造代码,同样如此。布瑞恩:我认为您可以回答这个问题……虽然-如果我不使用GCC怎么办?e、 g.叮当声还是国际刑事法院?