DllMain()和__attribute __((构造函数))执行顺序

LRN*_*LRN 1 dll winapi constructor

:如果我DllMain()在共享库中编写函数,还有一个函数__attribute__((constructor)),在加载库时首先执行哪一个函数?

:如果我__attribute__((constructor))在链接到该共享库的可执行文件中有函数,那么首先会调用什么 - 库DllMain()或可执行文件的__attribute__((constructor))函数?

LRN*_*LRN 5

:按此顺序调用函数:

  • DLL constructor
  • DLL DllMain() (process attach)
  • EXE constructor
  • EXE main()
  • EXE main() ends
  • EXE destructor
  • DLL DllMain() (process detach)
  • DLL destructor

如果在运行时(LoadLibrary()/ FreeLibrary())完成链接,则按以下顺序调用函数:

  • EXE constructor
  • EXE main()
  • EXE LoadLibrary()
  • DLL constructor
  • DLL DllMain() (process attach)
  • EXE main() continues
  • EXE FreeLibaray()
  • DLL DllMain() (process detach)
  • DLL destructor
  • EXE main() ends
  • EXE destructor

如果您忘记释放图书馆,那么订单是这样的:

  • EXE constructor
  • EXE main()
  • EXE LoadLibrary()
  • DLL constructor
  • DLL DllMain() (process attach)
  • EXE main() continues
  • EXE main() ends
  • EXE destructor
  • EXE FreeLibaray() (system cleans up for you)
  • DLL DllMain() (process detach)
  • DLL destructor