Make ld.so pass its cleanup handler in v0 and stop calling atexit(4) directly
authorkettenis <kettenis@openbsd.org>
Mon, 23 Dec 2013 21:18:57 +0000 (21:18 +0000)
committerkettenis <kettenis@openbsd.org>
Mon, 23 Dec 2013 21:18:57 +0000 (21:18 +0000)
from ld.so on alpha.  Note that this means that binaries built before early
december may no longer call destructors in shared libraries implemented in
C++.  Update your packages!

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

index 9998289..615da6c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.22 2013/11/10 19:23:14 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.23 2013/12/23 21:18:57 kettenis Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -103,7 +103,7 @@ L2: ldiq    s3, L2          /* get where the linker thought we were */
        mov     s2, a3          /* dl_data */
        CALL(_dl_boot)
        mov     s0, a0          /* stack */
-       mov     zero, a1        /* cleanup */
+       lda     a1, _dl_dtors   /* cleanup */
        mov     v0, pv
        jsr     ra, (pv)
 END(_dl_start)
index 0ac37b8..c8f43f9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: loader.c,v 1.137 2013/12/23 17:29:15 kettenis Exp $ */
+/*     $OpenBSD: loader.c,v 1.138 2013/12/23 21:18:57 kettenis Exp $ */
 
 /*
  * Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -604,7 +604,8 @@ _dl_boot(const char **argv, char **envp, const long dyn_loff, long *dl_data)
                _dl_call_init(_dl_objects);
        }
 
-#if !defined(__hppa__) && !defined(__i386__) && !defined(__sparc64__)
+#if !defined(__alpha__) && !defined(__hppa__) && !defined(__i386__) && \
+    !defined(__sparc64__)
        /*
         * Schedule a routine to be run at shutdown, by using atexit.
         * Cannot call atexit directly from ld.so?