This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: unwind failures due to __pthread_initialize_minimal


>>>>> On Wed, 19 Nov 2003 18:25:37 -0800, Ulrich Drepper <drepper@redhat.com> said:

  Uli> David Mosberger wrote:

  >> Ah, in fact there is already an ia64-specific version.  I missed
  >> it at first.  Turns out the problem really was worse: not only
  >> was it using .init, but the unwind directives for both _init and
  >> _fini were missing!  With the proper unwind info for _init and
  >> _fini, the old code was lucky enough to work fine, but I still
  >> think it's better to switch to .init_array both for cleanliness
  >> and consistency reasons.  LinuxThreads had the same problem.
  >> Patch to fix both is attached.

  Uli> Mostly OK.  But there still is a .init section and a DT_INIT
  Uli> entry.  The later must go.  I tried to simply remove the code
  Uli> for the .init section but this causes some tests to fail.

I don't have the complete picture of how pt-initfini.c is being used,
but if the goal is simply to ensure that (a)
__pthread_initialize_minimal_internal gets called first and (b) to
enable other code to specify their own constructors/destructors, then
I think the attached patch might work.  It certainly would be much
cleaner this way and it does get rid of the DT_INIT and DT_FINI
entries.

The patch seems to work fine for me (same "make check" results as
before).  I didn't update the linuxthreads version yet, but if this
patch looks fine, that's trivial to do.

	--david

Index: nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c,v
retrieving revision 1.1
diff -u -r1.1 pt-initfini.c
--- nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c	11 Mar 2003 09:20:41 -0000	1.1
+++ nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c	20 Nov 2003 04:01:06 -0000
@@ -36,6 +36,22 @@
    * crtn.s puts the corresponding function epilogues
    in the .init and .fini sections. */
 
+#include <stddef.h>
+
+#ifdef HAVE_INITFINI_ARRAY
+
+__asm__ ("\n\
+#include \"defs.h\"\n\
+\n\
+/*@HEADER_ENDS*/\n\
+\n\
+/*@_init_PROLOG_BEGINS*/\n\
+	.xdata8 \".init_array\",@fptr(__pthread_initialize_minimal_internal)\n\
+/*@_init_PROLOG_ENDS*/\n\
+");
+
+#else
+
 __asm__ ("\n\
 \n\
 #include \"defs.h\"\n\
@@ -48,13 +64,16 @@
 	.global _init#\n\
 	.proc _init#\n\
 _init:\n\
+	.prologue\n\
+	.save ar.pfs, r34\n\
 	alloc r34 = ar.pfs, 0, 3, 0, 0\n\
+	.vframe r32\n\
 	mov r32 = r12\n\
+	.save rp, r33\n\
 	mov r33 = b0\n\
+	.body\n\
 	adds r12 = -16, r12\n\
 	;;\n\
-/* we could use r35 to save gp, but we use the stack since that's what\n\
- * all the other init routines will do --davidm 00/04/05 */\n\
 	st8 [r12] = gp, -16\n\
 	br.call.sptk.many b0 = __pthread_initialize_minimal_internal# ;;\n\
 	;;\n\
@@ -62,7 +81,6 @@
 	;;\n\
 	ld8 gp = [r12]\n\
 	;;\n\
-	.align 16\n\
 	.endp _init#\n\
 \n\
 /*@_init_PROLOG_ENDS*/\n\
@@ -83,12 +101,16 @@
 	.global _fini#\n\
 	.proc _fini#\n\
 _fini:\n\
+	.prologue\n\
+	.save ar.pfs, r34\n\
 	alloc r34 = ar.pfs, 0, 3, 0, 0\n\
+	.vframe r32\n\
 	mov r32 = r12\n\
+	.save rp, r33\n\
 	mov r33 = b0\n\
+	.body\n\
 	adds r12 = -16, r12\n\
 	;;\n\
-	.align 16\n\
 	.endp _fini#\n\
 \n\
 /*@_fini_PROLOG_ENDS*/\n\
@@ -106,3 +128,5 @@
 /*@TRAILER_BEGINS*/\n\
 	.weak	__gmon_start__#\n\
 ");
+
+#endif


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