blob: c8918b8ffac73a184a5fef1bf0edb04d58a1450e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
--- 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
}
|