This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

We still need those old frame functions in libgcc.a


Let me try again to explain why we need to keep the
old __register_frame in libgcc.a.

A. __register_frame and shared libraries.

1. gcc builds shared libraries with crtbegin.o.
2. crtbegin.o calls __register_frame.
3. gcc builds shared libraries with -lgcc.
4. The shared libraries built by gcc have __register_frame
   which is visible by linker because of 1, 2, 3.

If we leave -lgcc out, linker will leave __register_frame
undefined in shared libraries, we have to keep
__register_frame in libgcc.a in new gcc. Otherwise, during
the link time, ld will find undefined __register_frame
referenced by shared libraries when new gcc is used.

B. We have to keep __register_frame in libgcc.a.

1. Say binary "foo" needs libbar.so, since __register_frame
is in libbar.so, linker will leave __register_frame
undefined in foo and the dynamic linker will find
__register_frame in libbar.so at the runtime.
2. If we remove __register_frame from libgcc.a in new
gcc and we rebuild libbar.so with the new gcc, now
libbar.so won't have __register_frame. Now the dynamic
linker won't find __register_frame at the run time
since it is no longer in libbar.so. We are in a big trouble.

Kenner, please keep __register_frame and its friends
in libgcc.a. Otherwise, gcc 2.8.0 is incompatible with
other gcc snapshots and egcs. Here is the patch.

Thanks.


-- 
H.J. Lu (hjl@gnu.org)
---
Sat Dec 13 21:46:53 1997  H.J. Lu  (hjl@gnu.org)

	* frame.h (__register_frame, __register_frame_table,
	__deregister_frame): New.

	* frame.c (__register_frame, __register_frame_table,
	__deregister_frame): New.

	* frame.c (__deregister_frame_info): Return void *.
	* frame.h (__deregister_frame_info): Ditto.
	* collect2.c (__deregister_frame_info): Ditto.
	
Index: frame.h
===================================================================
RCS file: /home/work/cvs/gnu/gcc/frame.h,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 frame.h
--- frame.h	1997/12/13 19:42:41	1.1.1.3
+++ frame.h	1997/12/14 05:37:59
@@ -34,6 +34,10 @@
   struct object *next;
 };
 
+extern void __register_frame (void * );
+extern void __register_frame_table (void *);
+extern void __deregister_frame (void *);
+
 /* Called either from crtbegin.o or a static constructor to register the
    unwind info for an object or translation unit, respectively.  */
 
@@ -46,7 +50,7 @@
 
 /* Called from crtend.o to deregister the unwind info for an object.  */
 
-extern void __deregister_frame_info (void *);
+extern void *__deregister_frame_info (void *);
 
 /* Called from __throw to find the registers to restore for a given
    PC_TARGET.  The caller should allocate a local variable of `struct
Index: collect2.c
===================================================================
RCS file: /home/work/cvs/gnu/gcc/collect2.c,v
retrieving revision 1.1.1.31
diff -u -r1.1.1.31 collect2.c
--- collect2.c	1997/12/13 19:42:32	1.1.1.31
+++ collect2.c	1997/12/14 05:38:18
@@ -1788,7 +1788,7 @@
       fprintf (stream, "};\n");
 
       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
-      fprintf (stream, "extern void __deregister_frame_info (void *);\n");
+      fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
 
       fprintf (stream, "static void reg_frame () {\n");
       fprintf (stream, "\tstatic struct object ob;\n");
@@ -1874,7 +1874,7 @@
       fprintf (stream, "};\n");
 
       fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
-      fprintf (stream, "extern void __deregister_frame_info (void *);\n");
+      fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
 
       fprintf (stream, "static void reg_frame () {\n");
       fprintf (stream, "\tstatic struct object ob;\n");
Index: frame.c
===================================================================
RCS file: /home/work/cvs/gnu/gcc/frame.c,v
retrieving revision 1.1.1.4
diff -u -r1.1.1.4 frame.c
--- frame.c	1997/12/13 19:42:38	1.1.1.4
+++ frame.c	1997/12/14 05:42:12
@@ -513,6 +513,13 @@
   objects = ob;
 }
 
+void
+__register_frame (void *begin)
+{
+  struct object *ob = (struct object *) malloc (sizeof (struct object));
+  __register_frame_info (begin, ob);                       
+}
+
 /* Similar, but BEGIN is actually a pointer to a table of unwind entries
    for different translation units.  Called from the file generated by
    collect2.  */
@@ -530,9 +537,16 @@
   objects = ob;
 }
 
+void
+__register_frame_table (void *begin)
+{
+  struct object *ob = (struct object *) malloc (sizeof (struct object));
+  __register_frame_info_table (begin, ob);
+}
+
 /* Called from crtend.o to deregister the unwind info for an object.  */
 
-void
+void *
 __deregister_frame_info (void *begin)
 {
   struct object **p = &objects;
@@ -548,11 +562,17 @@
 	  if (ob->pc_begin)
 	    free (ob->fde_array);
 
-	  return;
+	  return (void *) ob;
 	}
       p = &((*p)->next);
     }
   abort ();
+}
+
+void
+__deregister_frame (void *begin)
+{
+  free (__deregister_frame_info (begin));
 }
 
 /* Called from __throw to find the registers to restore for a given


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]