3
当你使用共享对象时,是否有一种机制让该DLL中的代码执行而不被显式调用?具体而言,调用者dlopen()
可能不知道的全局/静态C++静态初始化代码?我很确定答案应该是“是”,但我不记得是什么机制使这种情况发生,以及如何利用它来运行任意代码。静态初始化(和/或其他)代码在dlopen'ing时运行吗?
当你使用共享对象时,是否有一种机制让该DLL中的代码执行而不被显式调用?具体而言,调用者dlopen()
可能不知道的全局/静态C++静态初始化代码?我很确定答案应该是“是”,但我不记得是什么机制使这种情况发生,以及如何利用它来运行任意代码。静态初始化(和/或其他)代码在dlopen'ing时运行吗?
是: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
ed时使其运行。对于需要动态初始化的全局C++对象的构造代码也是如此。
http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian
@Brian:我认为你可以做出答案......虽然 - 如果我不使用GCC?例如铛或icc? – einpoklum