当您dlopen()
共享对象时,是否有一种机制可以在不明确调用的情况下执行该DLL中的代码?具体来说,dlopen()
的调用者可能不知道的全局/静态的C ++静态初始化代码?我很确定答案应该是“是”,但我不记得是什么机制会发生这种情况,以及如何利用它来运行任意代码。
答案 0 :(得分:3)
是:dlopen
尊重ELF二进制格式机制,以便在加载时运行代码。
实际上有两种这样的机制:
.init
和.fini
部分,其中包含要调用dlopen
和dlclose
的函数指针数组。由于这些部分可能在运行时不存在,因此还有DT_INIT
和DT_FINI
动态标记指向相应的部分。.init_array
和.fini_array
以及相应的DT_INIT_ARRAY
,DT_INIT_ARRAYSZ
,DT_FINI_ARRAY
和DT_FINI_ARRAYSZ
动态代码。描述了这两种机制之间的差异here。
进入源代码级别,如果使用__attribute__((constructor))
修饰C函数,编译器将使用这两种机制之一使其在对象dlopen
编辑时运行。对于需要动态初始化的全局C ++对象的构造代码也是如此。