diff options
| author | 2022-01-06 09:22:30 +0100 | |
|---|---|---|
| committer | 2022-01-06 09:22:30 +0100 | |
| commit | 8f66cfa156f04cc6f1f6a78bff261122de6801ca (patch) | |
| tree | c5c50a4515dca0b6003975d7683e5beaac21c731 | |
| parent | 8bc9ccc2bff2e3f92a952bf9ae9fa218f448c774 (diff) | |
| download | libirecovery-8f66cfa156f04cc6f1f6a78bff261122de6801ca.tar.gz libirecovery-8f66cfa156f04cc6f1f6a78bff261122de6801ca.tar.bz2 | |
Check availability of constructor attribute and use it on Windows in favor of DllMain
| -rw-r--r-- | configure.ac | 18 | ||||
| -rw-r--r-- | src/libirecovery.c | 28 | 
2 files changed, 36 insertions, 10 deletions
| diff --git a/configure.ac b/configure.ac index 518366c..e844956 100644 --- a/configure.ac +++ b/configure.ac @@ -82,6 +82,24 @@ case ${host_os} in  esac  AM_CONDITIONAL(WIN32, test x$win32 = xtrue) +# Check if the C compiler supports __attribute__((constructor)) +AC_CACHE_CHECK([wether the C compiler supports constructor/destructor attributes], +  ac_cv_attribute_constructor, [ +  ac_cv_attribute_constructor=no +  AC_COMPILE_IFELSE([AC_LANG_PROGRAM( +    [[ +      static void __attribute__((constructor)) test_constructor(void) { +      } +      static void __attribute__((destructor)) test_destructor(void) { +      } +    ]], [])], +    [ac_cv_attribute_constructor=yes] +  )] +) +if test "$ac_cv_attribute_constructor" = "yes"; then +  AC_DEFINE(HAVE_ATTRIBUTE_CONSTRUCTOR, 1, [Define if the C compiler supports constructor/destructor attributes]) +fi +  AC_ARG_WITH([dummy],  	[AS_HELP_STRING([--with-dummy], [Use no USB driver at all [default=no]. This is only useful if you just want to query the device list by product type or hardware model. All other operations are no-ops or will return IRECV_E_UNSUPPORTED.])],  	[], diff --git a/src/libirecovery.c b/src/libirecovery.c index 0e971a0..b0f6409 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c @@ -442,7 +442,23 @@ static void _irecv_deinit(void)  static thread_once_t init_once = THREAD_ONCE_INIT;  static thread_once_t deinit_once = THREAD_ONCE_INIT; -#ifdef WIN32 +#ifndef HAVE_ATTRIBUTE_CONSTRUCTOR +  #if defined(__llvm__) || defined(__GNUC__) +    #define HAVE_ATTRIBUTE_CONSTRUCTOR +  #endif +#endif + +#ifdef HAVE_ATTRIBUTE_CONSTRUCTOR +static void __attribute__((constructor)) libirecovery_initialize(void) +{ +	thread_once(&init_once, _irecv_init); +} + +static void __attribute__((destructor)) libirecovery_deinitialize(void) +{ +	thread_once(&deinit_once, _irecv_deinit); +} +#elif defined(WIN32)  BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)  {  	switch (dwReason) { @@ -458,15 +474,7 @@ BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)  	return 1;  }  #else -static void __attribute__((constructor)) libirecovery_initialize(void) -{ -	thread_once(&init_once, _irecv_init); -} - -static void __attribute__((destructor)) libirecovery_deinitialize(void) -{ -	thread_once(&deinit_once, _irecv_deinit); -} +#warning No compiler support for constructor/destructor attributes, some features might not be available.  #endif  #ifdef HAVE_IOKIT | 
