Make ld.so pass its cleanup handler in %g1 as required by the SPARC System V
authorkettenis <kettenis@openbsd.org>
Wed, 25 Dec 2013 11:10:02 +0000 (11:10 +0000)
committerkettenis <kettenis@openbsd.org>
Wed, 25 Dec 2013 11:10:02 +0000 (11:10 +0000)
ABI, and stop calling atexit(4) directly from ld.so on sparc.

libexec/ld.so/loader.c
libexec/ld.so/sparc/ldasm.S

index e7b8e28..275542c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: loader.c,v 1.140 2013/12/23 22:13:03 kettenis Exp $ */
+/*     $OpenBSD: loader.c,v 1.141 2013/12/25 11:10:02 kettenis Exp $ */
 
 /*
  * Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -605,7 +605,8 @@ _dl_boot(const char **argv, char **envp, const long dyn_loff, long *dl_data)
        }
 
 #if !defined(__alpha__) && !defined(__amd64__) && !defined(__hppa__) && \
-    !defined(__i386__) && !defined(__powerpc__) && !defined(__sparc64__)
+    !defined(__i386__) && !defined(__powerpc__) && !defined(__sparc__) && \
+    !defined(__sparc64__)
        /*
         * Schedule a routine to be run at shutdown, by using atexit.
         * Cannot call atexit directly from ld.so?
index ab6e633..17112f5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.21 2013/08/13 05:52:21 guenther Exp $     */
+/*     $OpenBSD: ldasm.S,v 1.22 2013/12/25 11:10:02 kettenis Exp $     */
 
 /*
  * Copyright (c) 2001 Jason L. Wright (jason@thought.net)
@@ -113,8 +113,13 @@ _dl_start:
 
        add     %sp, 32 + DL_DATA_SIZE, %sp     ! restore stack
 
+1:     call    2f
+        sethi  %hi(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
+2:     or      %l7, %lo(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
+       add     %l7, %o7, %l7
+
        jmp     %o0
-        clr    %g1                     ! XXX don't register with atexit
+        ld     [%l7 + _dl_dtors], %g1  ! %g1 = cleanup
 
 
        .section        ".text"