This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [cygming] make sure libgcc logic is consistent
- From: Kai Tietz <ktietz at redhat dot com>
- To: DJ Delorie <dj at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 24 Jul 2014 11:51:56 -0400 (EDT)
- Subject: Re: [cygming] make sure libgcc logic is consistent
- Authentication-results: sourceware.org; auth=none
- References: <201407221730 dot s6MHUA2j032116 at greed dot delorie dot com>
Hello DJ,
sorry for late reply. Patch is ok. Please apply.
Thanks,
Kai
----- Original Message -----
>
> This patch changes the logic in "crtbegin" that looks for libgcc.dll
> such that the test is only done once, guaranteeing consistent results
> between the register and deregister cases.
>
> Previously, a crash occurred if the application (directly or
> indirectly) caused libgcc.dll to load after main() was called
> (i.e. dlopen'd a DLL which required libgcc). In that case, the
> register test would return "no libgcc" and register with the local
> copy, yet the deregister test would return "yes libgcc" and try to
> deregister something with libgcc.dll that hadn't been registered.
>
> Index: cygming-crtbegin.c
> ===================================================================
> --- cygming-crtbegin.c (revision 212915)
> +++ cygming-crtbegin.c (working copy)
> @@ -99,12 +99,13 @@ static EH_FRAME_SECTION_CONST char __EH_
> = { };
>
> static struct object obj;
>
> /* Handle of libgcc's DLL reference. */
> HANDLE hmod_libgcc;
> +static void * (*deregister_frame_fn) (const void *) == NULL;
> #endif
>
> #if TARGET_USE_JCR_SECTION
> static void *__JCR_LIST__[]
> __attribute__ ((used, section(JCR_SECTION_NAME), aligned(4)))
> = { };
> @@ -130,15 +131,20 @@ __gcc_register_frame (void)
> if (h)
> {
> /* Increasing the load-count of LIBGCC_SONAME DLL. */
> hmod_libgcc = LoadLibrary (LIBGCC_SONAME);
> register_frame_fn = (void (*) (const void *, struct object *))
> GetProcAddress (h, "__register_frame_info");
> + deregister_frame_fn = (void* (*) (const void *))
> + GetProcAddress (h, "__deregister_frame_info");
> + }
> + else
> + {
> + register_frame_fn = __register_frame_info;
> + deregister_frame_fn = __deregister_frame_info;
> }
> - else
> - register_frame_fn = __register_frame_info;
> if (register_frame_fn)
> register_frame_fn (__EH_FRAME_BEGIN__, &obj);
> #endif
>
> #if TARGET_USE_JCR_SECTION
> if (__JCR_LIST__[0])
> @@ -158,19 +164,12 @@ __gcc_register_frame (void)
> }
>
> void
> __gcc_deregister_frame (void)
> {
> #if DWARF2_UNWIND_INFO
> - void * (*deregister_frame_fn) (const void *);
> - HANDLE h = GetModuleHandle (LIBGCC_SONAME);
> - if (h)
> - deregister_frame_fn = (void* (*) (const void *))
> - GetProcAddress (h, "__deregister_frame_info");
> - else
> - deregister_frame_fn = __deregister_frame_info;
> if (deregister_frame_fn)
> deregister_frame_fn (__EH_FRAME_BEGIN__);
> if (hmod_libgcc)
> FreeLibrary (hmod_libgcc);
> #endif
> }
>