3

当你使用共享对象时,是否有一种机制让该DLL中的代码执行而不被显式调用?具体而言,调用者dlopen()可能不知道的全局/静态C++静态初始化代码?我很确定答案应该是“是”,但我不记得是什么机制使这种情况发生,以及如何利用它来运行任意代码。静态初始化(和/或其他)代码在dlopen'ing时运行吗?

+1

http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian

+0

@Brian:我认为你可以做出答案......虽然 - 如果我不使用GCC?例如铛或icc? – einpoklum

回答

2

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

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

  • 一个旧的一个使用特殊.init.fini各款,其含有的函数指针为dlopendlclose阵列调用。由于这些部分在运行时可能不存在,因此还有指向相应部分的动态标签DT_INITDT_FINI
  • 较新的机制是.init_array.fini_array和相应的DT_INIT_ARRAY,DT_INIT_ARRAYSZ,DT_FINI_ARRAYDT_FINI_ARRAYSZ动态标签。

这两种机制之间的区别描述如下here

如果您使用__attribute__((constructor))修饰C函数,编译器将使用这两种机制之一在对象为dlopen ed时使其运行。对于需要动态初始化的全局C++对象的构造代码也是如此。