46 lines
1.4 KiB
Diff
46 lines
1.4 KiB
Diff
--- libgcc/config/i386/cygming-crtbegin.c.orig 2013-07-25 18:39:34.579552100 +0800
|
|
+++ libgcc/config/i386/cygming-crtbegin.c 2013-07-25 18:43:51.778712300 +0800
|
|
@@ -100,6 +100,8 @@
|
|
extern void __gcc_register_frame (void);
|
|
extern void __gcc_deregister_frame (void);
|
|
|
|
+static HANDLE libgcc_dll;
|
|
+
|
|
void
|
|
__gcc_register_frame (void)
|
|
{
|
|
@@ -112,8 +114,11 @@
|
|
void (*register_frame_fn) (const void *, struct object *);
|
|
HANDLE h = GetModuleHandle (LIBGCC_SONAME);
|
|
if (h)
|
|
- register_frame_fn = (void (*) (const void *, struct object *))
|
|
- GetProcAddress (h, "__register_frame_info");
|
|
+ {
|
|
+ libgcc_dll = LoadLibrary (LIBGCC_SONAME); /* Hold reference */
|
|
+ register_frame_fn = (void (*) (const void *, struct object *))
|
|
+ GetProcAddress (h, "__register_frame_info");
|
|
+ }
|
|
else
|
|
register_frame_fn = __register_frame_info;
|
|
if (register_frame_fn)
|
|
@@ -142,13 +147,16 @@
|
|
{
|
|
#if DWARF2_UNWIND_INFO
|
|
void * (*deregister_frame_fn) (const void *);
|
|
- HANDLE h = GetModuleHandle (LIBGCC_SONAME);
|
|
- if (h)
|
|
+ if (libgcc_dll)
|
|
deregister_frame_fn = (void* (*) (const void *))
|
|
- GetProcAddress (h, "__deregister_frame_info");
|
|
+ GetProcAddress (libgcc_dll, "__deregister_frame_info");
|
|
else
|
|
deregister_frame_fn = __deregister_frame_info;
|
|
if (deregister_frame_fn)
|
|
deregister_frame_fn (__EH_FRAME_BEGIN__);
|
|
+
|
|
+if (libgcc_dll)
|
|
+ FreeLibrary (libgcc_dll);
|
|
+
|
|
#endif
|
|
}
|