summaryrefslogtreecommitdiffstats
path: root/gcc48-libgcc-references.patch
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
 }