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


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: [PATCH] Add sparc64 tls and nptl support


On Sat, Apr 09, 2005 at 09:35:24PM -0700, David S. Miller wrote:
> 2005-04-09  David S. Miller  <davem@davemloft.net>
> 
> 	Add sparc64 TLS and NPTL support.

Looks good to me, but:

>         (elf_machine_type_cleaa): Likewise.

Typo, should be elf_machine_type_class.

> 	* sysdeps/unix/sysv/linux/kernel-features.h
> 	(__ASSUME_REALTIME_SIGNALS): Always set to 1 on ia64 and sparc64.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/clone.S: NULL terminate
> 	backtrace by zero'ing out %fp.  Allocate 6 argument slots just
> 	like on sparc64.

I don't like this hunk.  ia64 has arch_minimum_kernel=2.4.0
in sysdeps/unix/sysv/linux/configure*, so mentioning ia64 there is
pointless.  ATM sparc64 allows configuring even for 2.0.10 kernel,
but that doesn't match reality, you can't use that old kernels with
sparc64 glibc.  I'd argue that you can't use anything older than 2.4.21
for current sparc 64-bit glibc, given
http://linux.bkbits.net:8080/linux-2.5/diffs/arch/sparc64/kernel/signal.c@1.27
so IMHO sysdeps/unix/sysv/linux/configure* should have
arch_minimum_kernel=2.4.21 for sparc64.

> --- sysdeps/unix/sysv/linux/kernel-features.h	26 Jan 2005 20:01:10 -0000	1.83
> +++ sysdeps/unix/sysv/linux/kernel-features.h	10 Apr 2005 03:50:58 -0000
> @@ -48,8 +48,11 @@
>  # define __ASSUME_GETCWD_SYSCALL	1
>  #endif
>  
> -/* Real-time signal became usable in 2.1.70.  */
> -#if __LINUX_KERNEL_VERSION >= 131398
> +/* Real-time signal became usable in 2.1.70.  Some platforms have had
> +   them all along.  */
> +#if __LINUX_KERNEL_VERSION >= 131398 || \
> +    (defined __sparc__ && defined __arch64__) || \
> +    defined __ia64__
>  # define __ASSUME_REALTIME_SIGNALS	1
>  #endif

> --- sysdeps/unix/sysv/linux/sparc/sparc64/pause.c	14 Mar 2003 23:37:01 -0000	1.2
> +++ sysdeps/unix/sysv/linux/sparc/sparc64/pause.c	10 Apr 2005 03:50:59 -0000
> @@ -1 +1,47 @@
> -#include <sysdeps/posix/pause.c>
> +/* pause -- suspend the process until a signal arrives.  POSIX.1 version.
> +   Copyright (C) 2003 Free Software Foundation, Inc.

Given that you touched it now, shouldn't that be 2003, 2005?

I'm getting warnings about dl-machine.h though, so IMHO we need
something like following patch on top of your patch (although the patch
looks really big, it mostly is just moving ~ 250 lines around).

2005-04-13  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/sparc/sparc64/dl-machine.h: Add dl_machine_h multiple
	inclusion guard for the first half of the header.
	(elf_machine_type_class, ELF_MACHINE_JMP_SLOT, ELF_MACHINE_NO_REL,
	ELF_MACHINE_PLTREL_OVERLAP, elf_machine_runtime_setup,
	elf_machine_relplt, DL_STACK_END, RTLD_START): Move into the
	#ifndef dl_machine_h guarded part of the header.

--- libc/sysdeps/sparc/sparc64/dl-machine.h.jj	2005-04-13 16:33:39.172664000 -0400
+++ libc/sysdeps/sparc/sparc64/dl-machine.h	2005-04-13 17:32:10.980789001 -0400
@@ -18,6 +18,9 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#ifndef dl_machine_h
+#define dl_machine_h
+
 #define ELF_MACHINE_NAME "sparc64"
 
 #include <string.h>
@@ -233,6 +236,255 @@ elf_machine_plt_value (struct link_map *
   return value;
 }
 
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
+# define elf_machine_type_class(type) \
+  ((((type) == R_SPARC_JMP_SLOT						      \
+     || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64))     \
+    * ELF_RTYPE_CLASS_PLT)						      \
+   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
+#else
+# define elf_machine_type_class(type) \
+  ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)	\
+   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
+#endif
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
+#define ELF_MACHINE_JMP_SLOT	R_SPARC_JMP_SLOT
+
+/* The SPARC never uses Elf64_Rel relocations.  */
+#define ELF_MACHINE_NO_REL 1
+
+/* The SPARC overlaps DT_RELA and DT_PLTREL.  */
+#define ELF_MACHINE_PLTREL_OVERLAP 1
+
+/* Set up the loaded object described by L so its unrelocated PLT
+   entries will jump to the on-demand fixup code in dl-runtime.c.  */
+
+static inline int
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+  if (l->l_info[DT_JMPREL] && lazy)
+    {
+      extern void _dl_runtime_resolve_0 (void);
+      extern void _dl_runtime_resolve_1 (void);
+      extern void _dl_runtime_profile_0 (void);
+      extern void _dl_runtime_profile_1 (void);
+      Elf64_Addr res0_addr, res1_addr;
+      unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]);
+
+      if (__builtin_expect(profile, 0))
+	{
+	  res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
+	  res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
+
+	  if (GLRO(dl_profile) != NULL
+	      && _dl_name_match_p (GLRO(dl_profile), l))
+	    GL(dl_profile_map) = l;
+	}
+      else
+	{
+	  res0_addr = (Elf64_Addr) &_dl_runtime_resolve_0;
+	  res1_addr = (Elf64_Addr) &_dl_runtime_resolve_1;
+	}
+
+      /* PLT0 looks like:
+
+         sethi	%uhi(_dl_runtime_{resolve,profile}_0), %g4
+	 sethi	%hi(_dl_runtime_{resolve,profile}_0), %g5
+	 or	%g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4
+	 or	%g5, %lo(_dl_runtime_{resolve,profile}_0), %g5
+	 sllx	%g4, 32, %g4
+	 add	%g4, %g5, %g5
+	 jmpl	%g5, %g4
+	  nop
+       */
+
+      plt[0] = 0x09000000 | (res0_addr >> (64 - 22));
+      plt[1] = 0x0b000000 | ((res0_addr >> 10) & 0x003fffff);
+      plt[2] = 0x88112000 | ((res0_addr >> 32) & 0x3ff);
+      plt[3] = 0x8a116000 | (res0_addr & 0x3ff);
+      plt[4] = 0x89293020;
+      plt[5] = 0x8a010005;
+      plt[6] = 0x89c14000;
+      plt[7] = 0x01000000;
+
+      /* PLT1 looks like:
+
+         sethi	%uhi(_dl_runtime_{resolve,profile}_1), %g4
+	 sethi	%hi(_dl_runtime_{resolve,profile}_1), %g5
+	 or	%g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4
+	 or	%g5, %lo(_dl_runtime_{resolve,profile}_1), %g5
+	 sllx	%g4, 32, %g4
+	 add	%g4, %g5, %g5
+	 jmpl	%g5, %g4
+	  nop
+       */
+
+      plt[8] = 0x09000000 | (res1_addr >> (64 - 22));
+      plt[9] = 0x0b000000 | ((res1_addr >> 10) & 0x003fffff);
+      plt[10] = 0x88112000 | ((res1_addr >> 32) & 0x3ff);
+      plt[11] = 0x8a116000 | (res1_addr & 0x3ff);
+      plt[12] = 0x89293020;
+      plt[13] = 0x8a010005;
+      plt[14] = 0x89c14000;
+      plt[15] = 0x01000000;
+
+      /* Now put the magic cookie at the beginning of .PLT2
+	 Entry .PLT3 is unused by this implementation.  */
+      *((struct link_map **)(&plt[16])) = l;
+
+      if (__builtin_expect (l->l_info[VALIDX(DT_GNU_PRELINKED)] != NULL, 0)
+	  || __builtin_expect (l->l_info [VALIDX (DT_GNU_LIBLISTSZ)] != NULL, 0))
+	{
+	  /* Need to reinitialize .plt to undo prelinking.  */
+	  Elf64_Rela *rela = (Elf64_Rela *) D_PTR (l, l_info[DT_JMPREL]);
+	  Elf64_Rela *relaend
+	    = (Elf64_Rela *) ((char *) rela
+			      + l->l_info[DT_PLTRELSZ]->d_un.d_val);
+
+	  /* prelink must ensure there are no R_SPARC_NONE relocs left
+	     in .rela.plt.  */
+	  while (rela < relaend)
+	    {
+	      if (__builtin_expect (rela->r_addend, 0) != 0)
+		{
+                  Elf64_Addr slot = ((rela->r_offset + 0x400
+				      - (Elf64_Addr) plt)
+				     / 0x1400) * 0x1400
+				    + (Elf64_Addr) plt - 0x400;
+		  /* ldx [%o7 + X], %g1  */
+		  unsigned int first_ldx = *(unsigned int *)(slot + 12);
+		  Elf64_Addr ptr = slot + (first_ldx & 0xfff) + 4;
+
+		  *(Elf64_Addr *) rela->r_offset
+		    = (Elf64_Addr) plt
+		      - (slot + ((rela->r_offset - ptr) / 8) * 24 + 4);
+		  ++rela;
+		  continue;
+		}
+
+	      *(unsigned int *) rela->r_offset
+		= 0x03000000 | (rela->r_offset - (Elf64_Addr) plt);
+	      *(unsigned int *) (rela->r_offset + 4)
+		= 0x30680000 | ((((Elf64_Addr) plt + 32
+				  - rela->r_offset - 4) >> 2) & 0x7ffff);
+	      __asm __volatile ("flush %0" : : "r" (rela->r_offset));
+	      __asm __volatile ("flush %0+4" : : "r" (rela->r_offset));
+	      ++rela;
+	    }
+	}
+    }
+
+  return lazy;
+}
+
+/* The PLT uses Elf64_Rela relocs.  */
+#define elf_machine_relplt elf_machine_rela
+
+/* Undo the sub %sp, 6*8, %sp; add %sp, STACK_BIAS + 22*8, %o0 below
+   to get at the value we want in __libc_stack_end.  */
+#define DL_STACK_END(cookie) \
+  ((void *) (((long) (cookie)) - (22 - 6) * 8 - STACK_BIAS))
+
+/* Initial entry point code for the dynamic linker.
+   The C function `_dl_start' is the real entry point;
+   its return value is the user program's entry point.  */
+
+#define __S1(x)	#x
+#define __S(x)	__S1(x)
+
+#define RTLD_START __asm__ ( "\n"					\
+"	.text\n"							\
+"	.global	_start\n"						\
+"	.type	_start, @function\n"					\
+"	.align	32\n"							\
+"_start:\n"								\
+"   /* Make room for functions to drop their arguments on the stack.  */\n" \
+"	sub	%sp, 6*8, %sp\n"					\
+"   /* Pass pointer to argument block to _dl_start.  */\n"		\
+"	call	_dl_start\n"						\
+"	 add	 %sp," __S(STACK_BIAS) "+22*8,%o0\n"			\
+"	/* FALLTHRU */\n"						\
+"	.size _start, .-_start\n"					\
+"\n"									\
+"	.global	_dl_start_user\n"					\
+"	.type	_dl_start_user, @function\n"				\
+"_dl_start_user:\n"							\
+"   /* Load the GOT register.  */\n"					\
+"1:	call	11f\n"							\
+"	 sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n"		\
+"11:	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n"		\
+"	sethi	%hi(_dl_skip_args), %g5\n"				\
+"	add	%l7, %o7, %l7\n"					\
+"	or	%g5, %lo(_dl_skip_args), %g5\n"				\
+"   /* Save the user entry point address in %l0.  */\n"			\
+"	mov	%o0, %l0\n"						\
+"   /* See if we were run as a command with the executable file name as an\n" \
+"      extra leading argument.  If so, we must shift things around since we\n" \
+"      must keep the stack doubleword aligned.  */\n"			\
+"	ldx	[%l7 + %g5], %i0\n"					\
+"	ld	[%i0], %i0\n"						\
+"	brz,pt	%i0, 2f\n"						\
+"	 ldx	[%sp + " __S(STACK_BIAS) " + 22*8], %i5\n"		\
+"	/* Find out how far to shift.  */\n"				\
+"	sethi	%hi(_dl_argv), %l4\n"					\
+"	sub	%i5, %i0, %i5\n"					\
+"	or	%l4, %lo(_dl_argv), %l4\n"				\
+"	sllx	%i0, 3, %l6\n"						\
+"	ldx	[%l7 + %l4], %l4\n"					\
+"	stx	%i5, [%sp + " __S(STACK_BIAS) " + 22*8]\n"		\
+"	add	%sp, " __S(STACK_BIAS) " + 23*8, %i1\n"			\
+"	add	%i1, %l6, %i2\n"					\
+"	ldx	[%l4], %l5\n"						\
+"	/* Copy down argv.  */\n"					\
+"12:	ldx	[%i2], %i3\n"						\
+"	add	%i2, 8, %i2\n"						\
+"	stx	%i3, [%i1]\n"						\
+"	brnz,pt	%i3, 12b\n"						\
+"	 add	%i1, 8, %i1\n"						\
+"	sub	%l5, %l6, %l5\n"					\
+"	/* Copy down envp.  */\n"					\
+"13:	ldx	[%i2], %i3\n"						\
+"	add	%i2, 8, %i2\n"						\
+"	stx	%i3, [%i1]\n"						\
+"	brnz,pt	%i3, 13b\n"						\
+"	 add	%i1, 8, %i1\n"						\
+"	/* Copy down auxiliary table.  */\n"				\
+"14:	ldx	[%i2], %i3\n"						\
+"	ldx	[%i2 + 8], %i4\n"					\
+"	add	%i2, 16, %i2\n"						\
+"	stx	%i3, [%i1]\n"						\
+"	stx	%i4, [%i1 + 8]\n"					\
+"	brnz,pt	%i3, 14b\n"						\
+"	 add	%i1, 16, %i1\n"						\
+"	stx	%l5, [%l4]\n"						\
+"  /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp.  */\n"	\
+"2:	sethi	%hi(_rtld_local), %o0\n"				\
+"	add	%sp, " __S(STACK_BIAS) " + 23*8, %o2\n"			\
+"	orcc	%o0, %lo(_rtld_local), %o0\n"				\
+"	sllx	%i5, 3, %o3\n"						\
+"	ldx	[%l7 + %o0], %o0\n"					\
+"	add	%o3, 8, %o3\n"						\
+"	mov	%i5, %o1\n"						\
+"	add	%o2, %o3, %o3\n"					\
+"	call	_dl_init_internal\n"					\
+"	 ldx	[%o0], %o0\n"						\
+"   /* Pass our finalizer function to the user in %g1.  */\n"		\
+"	sethi	%hi(_dl_fini), %g1\n"					\
+"	or	%g1, %lo(_dl_fini), %g1\n"				\
+"	ldx	[%l7 + %g1], %g1\n"					\
+"  /* Jump to the user's entry point and deallocate the extra stack we got.  */\n" \
+"	jmp	%l0\n"							\
+"	 add	%sp, 6*8, %sp\n"					\
+"	.size	_dl_start_user, . - _dl_start_user\n"			\
+"	.previous\n");
+
+#endif /* dl_machine_h */
+
 #define ARCH_LA_PLTENTER	sparc64_gnu_pltenter
 #define ARCH_LA_PLTEXIT		sparc64_gnu_pltexit
 
@@ -516,251 +768,4 @@ elf_machine_lazy_rel (struct link_map *m
     }
 }
 
-#endif	/* RESOLVE */
-
-/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.
-   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
-   of the main executable's symbols, as for a COPY reloc.  */
-#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
-# define elf_machine_type_class(type) \
-  ((((type) == R_SPARC_JMP_SLOT						      \
-     || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64))     \
-    * ELF_RTYPE_CLASS_PLT)						      \
-   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
-#else
-# define elf_machine_type_class(type) \
-  ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)	\
-   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
-#endif
-
-/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
-#define ELF_MACHINE_JMP_SLOT	R_SPARC_JMP_SLOT
-
-/* The SPARC never uses Elf64_Rel relocations.  */
-#define ELF_MACHINE_NO_REL 1
-
-/* The SPARC overlaps DT_RELA and DT_PLTREL.  */
-#define ELF_MACHINE_PLTREL_OVERLAP 1
-
-/* Set up the loaded object described by L so its unrelocated PLT
-   entries will jump to the on-demand fixup code in dl-runtime.c.  */
-
-static inline int
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
-{
-  if (l->l_info[DT_JMPREL] && lazy)
-    {
-      extern void _dl_runtime_resolve_0 (void);
-      extern void _dl_runtime_resolve_1 (void);
-      extern void _dl_runtime_profile_0 (void);
-      extern void _dl_runtime_profile_1 (void);
-      Elf64_Addr res0_addr, res1_addr;
-      unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]);
-
-      if (__builtin_expect(profile, 0))
-	{
-	  res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
-	  res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
-
-	  if (GLRO(dl_profile) != NULL
-	      && _dl_name_match_p (GLRO(dl_profile), l))
-	    GL(dl_profile_map) = l;
-	}
-      else
-	{
-	  res0_addr = (Elf64_Addr) &_dl_runtime_resolve_0;
-	  res1_addr = (Elf64_Addr) &_dl_runtime_resolve_1;
-	}
-
-      /* PLT0 looks like:
-
-         sethi	%uhi(_dl_runtime_{resolve,profile}_0), %g4
-	 sethi	%hi(_dl_runtime_{resolve,profile}_0), %g5
-	 or	%g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4
-	 or	%g5, %lo(_dl_runtime_{resolve,profile}_0), %g5
-	 sllx	%g4, 32, %g4
-	 add	%g4, %g5, %g5
-	 jmpl	%g5, %g4
-	  nop
-       */
-
-      plt[0] = 0x09000000 | (res0_addr >> (64 - 22));
-      plt[1] = 0x0b000000 | ((res0_addr >> 10) & 0x003fffff);
-      plt[2] = 0x88112000 | ((res0_addr >> 32) & 0x3ff);
-      plt[3] = 0x8a116000 | (res0_addr & 0x3ff);
-      plt[4] = 0x89293020;
-      plt[5] = 0x8a010005;
-      plt[6] = 0x89c14000;
-      plt[7] = 0x01000000;
-
-      /* PLT1 looks like:
-
-         sethi	%uhi(_dl_runtime_{resolve,profile}_1), %g4
-	 sethi	%hi(_dl_runtime_{resolve,profile}_1), %g5
-	 or	%g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4
-	 or	%g5, %lo(_dl_runtime_{resolve,profile}_1), %g5
-	 sllx	%g4, 32, %g4
-	 add	%g4, %g5, %g5
-	 jmpl	%g5, %g4
-	  nop
-       */
-
-      plt[8] = 0x09000000 | (res1_addr >> (64 - 22));
-      plt[9] = 0x0b000000 | ((res1_addr >> 10) & 0x003fffff);
-      plt[10] = 0x88112000 | ((res1_addr >> 32) & 0x3ff);
-      plt[11] = 0x8a116000 | (res1_addr & 0x3ff);
-      plt[12] = 0x89293020;
-      plt[13] = 0x8a010005;
-      plt[14] = 0x89c14000;
-      plt[15] = 0x01000000;
-
-      /* Now put the magic cookie at the beginning of .PLT2
-	 Entry .PLT3 is unused by this implementation.  */
-      *((struct link_map **)(&plt[16])) = l;
-
-      if (__builtin_expect (l->l_info[VALIDX(DT_GNU_PRELINKED)] != NULL, 0)
-	  || __builtin_expect (l->l_info [VALIDX (DT_GNU_LIBLISTSZ)] != NULL, 0))
-	{
-	  /* Need to reinitialize .plt to undo prelinking.  */
-	  Elf64_Rela *rela = (Elf64_Rela *) D_PTR (l, l_info[DT_JMPREL]);
-	  Elf64_Rela *relaend
-	    = (Elf64_Rela *) ((char *) rela
-			      + l->l_info[DT_PLTRELSZ]->d_un.d_val);
-
-	  /* prelink must ensure there are no R_SPARC_NONE relocs left
-	     in .rela.plt.  */
-	  while (rela < relaend)
-	    {
-	      if (__builtin_expect (rela->r_addend, 0) != 0)
-		{
-                  Elf64_Addr slot = ((rela->r_offset + 0x400
-				      - (Elf64_Addr) plt)
-				     / 0x1400) * 0x1400
-				    + (Elf64_Addr) plt - 0x400;
-		  /* ldx [%o7 + X], %g1  */
-		  unsigned int first_ldx = *(unsigned int *)(slot + 12);
-		  Elf64_Addr ptr = slot + (first_ldx & 0xfff) + 4;
-
-		  *(Elf64_Addr *) rela->r_offset
-		    = (Elf64_Addr) plt
-		      - (slot + ((rela->r_offset - ptr) / 8) * 24 + 4);
-		  ++rela;
-		  continue;
-		}
-
-	      *(unsigned int *) rela->r_offset
-		= 0x03000000 | (rela->r_offset - (Elf64_Addr) plt);
-	      *(unsigned int *) (rela->r_offset + 4)
-		= 0x30680000 | ((((Elf64_Addr) plt + 32
-				  - rela->r_offset - 4) >> 2) & 0x7ffff);
-	      __asm __volatile ("flush %0" : : "r" (rela->r_offset));
-	      __asm __volatile ("flush %0+4" : : "r" (rela->r_offset));
-	      ++rela;
-	    }
-	}
-    }
-
-  return lazy;
-}
-
-/* The PLT uses Elf64_Rela relocs.  */
-#define elf_machine_relplt elf_machine_rela
-
-/* Undo the sub %sp, 6*8, %sp; add %sp, STACK_BIAS + 22*8, %o0 below
-   to get at the value we want in __libc_stack_end.  */
-#define DL_STACK_END(cookie) \
-  ((void *) (((long) (cookie)) - (22 - 6) * 8 - STACK_BIAS))
-
-/* Initial entry point code for the dynamic linker.
-   The C function `_dl_start' is the real entry point;
-   its return value is the user program's entry point.  */
-
-#define __S1(x)	#x
-#define __S(x)	__S1(x)
-
-#define RTLD_START __asm__ ( "\n"					\
-"	.text\n"							\
-"	.global	_start\n"						\
-"	.type	_start, @function\n"					\
-"	.align	32\n"							\
-"_start:\n"								\
-"   /* Make room for functions to drop their arguments on the stack.  */\n" \
-"	sub	%sp, 6*8, %sp\n"					\
-"   /* Pass pointer to argument block to _dl_start.  */\n"		\
-"	call	_dl_start\n"						\
-"	 add	 %sp," __S(STACK_BIAS) "+22*8,%o0\n"			\
-"	/* FALLTHRU */\n"						\
-"	.size _start, .-_start\n"					\
-"\n"									\
-"	.global	_dl_start_user\n"					\
-"	.type	_dl_start_user, @function\n"				\
-"_dl_start_user:\n"							\
-"   /* Load the GOT register.  */\n"					\
-"1:	call	11f\n"							\
-"	 sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n"		\
-"11:	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n"		\
-"	sethi	%hi(_dl_skip_args), %g5\n"				\
-"	add	%l7, %o7, %l7\n"					\
-"	or	%g5, %lo(_dl_skip_args), %g5\n"				\
-"   /* Save the user entry point address in %l0.  */\n"			\
-"	mov	%o0, %l0\n"						\
-"   /* See if we were run as a command with the executable file name as an\n" \
-"      extra leading argument.  If so, we must shift things around since we\n" \
-"      must keep the stack doubleword aligned.  */\n"			\
-"	ldx	[%l7 + %g5], %i0\n"					\
-"	ld	[%i0], %i0\n"						\
-"	brz,pt	%i0, 2f\n"						\
-"	 ldx	[%sp + " __S(STACK_BIAS) " + 22*8], %i5\n"		\
-"	/* Find out how far to shift.  */\n"				\
-"	sethi	%hi(_dl_argv), %l4\n"					\
-"	sub	%i5, %i0, %i5\n"					\
-"	or	%l4, %lo(_dl_argv), %l4\n"				\
-"	sllx	%i0, 3, %l6\n"						\
-"	ldx	[%l7 + %l4], %l4\n"					\
-"	stx	%i5, [%sp + " __S(STACK_BIAS) " + 22*8]\n"		\
-"	add	%sp, " __S(STACK_BIAS) " + 23*8, %i1\n"			\
-"	add	%i1, %l6, %i2\n"					\
-"	ldx	[%l4], %l5\n"						\
-"	/* Copy down argv.  */\n"					\
-"12:	ldx	[%i2], %i3\n"						\
-"	add	%i2, 8, %i2\n"						\
-"	stx	%i3, [%i1]\n"						\
-"	brnz,pt	%i3, 12b\n"						\
-"	 add	%i1, 8, %i1\n"						\
-"	sub	%l5, %l6, %l5\n"					\
-"	/* Copy down envp.  */\n"					\
-"13:	ldx	[%i2], %i3\n"						\
-"	add	%i2, 8, %i2\n"						\
-"	stx	%i3, [%i1]\n"						\
-"	brnz,pt	%i3, 13b\n"						\
-"	 add	%i1, 8, %i1\n"						\
-"	/* Copy down auxiliary table.  */\n"				\
-"14:	ldx	[%i2], %i3\n"						\
-"	ldx	[%i2 + 8], %i4\n"					\
-"	add	%i2, 16, %i2\n"						\
-"	stx	%i3, [%i1]\n"						\
-"	stx	%i4, [%i1 + 8]\n"					\
-"	brnz,pt	%i3, 14b\n"						\
-"	 add	%i1, 16, %i1\n"						\
-"	stx	%l5, [%l4]\n"						\
-"  /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp.  */\n"	\
-"2:	sethi	%hi(_rtld_local), %o0\n"				\
-"	add	%sp, " __S(STACK_BIAS) " + 23*8, %o2\n"			\
-"	orcc	%o0, %lo(_rtld_local), %o0\n"				\
-"	sllx	%i5, 3, %o3\n"						\
-"	ldx	[%l7 + %o0], %o0\n"					\
-"	add	%o3, 8, %o3\n"						\
-"	mov	%i5, %o1\n"						\
-"	add	%o2, %o3, %o3\n"					\
-"	call	_dl_init_internal\n"					\
-"	 ldx	[%o0], %o0\n"						\
-"   /* Pass our finalizer function to the user in %g1.  */\n"		\
-"	sethi	%hi(_dl_fini), %g1\n"					\
-"	or	%g1, %lo(_dl_fini), %g1\n"				\
-"	ldx	[%l7 + %g1], %g1\n"					\
-"  /* Jump to the user's entry point and deallocate the extra stack we got.  */\n" \
-"	jmp	%l0\n"							\
-"	 add	%sp, 6*8, %sp\n"					\
-"	.size	_dl_start_user, . - _dl_start_user\n"			\
-"	.previous\n");
+#endif	/* RESOLVE_MAP */


	Jakub


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