Make ld.so pass its cleanup handler in %rdx as required by the AMD64 System V
authorkettenis <kettenis@openbsd.org>
Mon, 23 Dec 2013 22:13:03 +0000 (22:13 +0000)
committerkettenis <kettenis@openbsd.org>
Mon, 23 Dec 2013 22:13:03 +0000 (22:13 +0000)
ABI, and stop calling atexit(4) directly from ld.so on amd64.  Note that this
means that binaries built before the middle of november may no longer call
destructors in shared libraries implemented in C++.  Update your packages!

ok guenther@

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

index da470d9..00b4e8c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.13 2013/08/13 05:52:18 guenther Exp $     */
+/*     $OpenBSD: ldasm.S,v 1.14 2013/12/23 22:13:03 kettenis Exp $     */
 
 /*
  * Copyright (c) 2002,2004 Dale Rahn
@@ -63,9 +63,7 @@ _dl_start:
 
        addq    $DL_DATA_SIZE,%rsp      # return dl_data
 
-#      popq    %rbx                    # %rbx = ps_strings - XXXDSR
-#      popq    %rcx                    # %rcx = obj_main - XXXDSR
-       movq    $0, %rdx                # %rdx = cleanup - XXXDSR
+       leaq    _dl_dtors(%rip), %rdx   # %rdx = cleanup
        movq    %r12, %rsp
        jmp     *%rax
 
index 84e41b2..e7b8e28 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: loader.c,v 1.139 2013/12/23 22:03:52 kettenis Exp $ */
+/*     $OpenBSD: loader.c,v 1.140 2013/12/23 22:13:03 kettenis Exp $ */
 
 /*
  * Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -604,8 +604,8 @@ _dl_boot(const char **argv, char **envp, const long dyn_loff, long *dl_data)
                _dl_call_init(_dl_objects);
        }
 
-#if !defined(__alpha__) && !defined(__hppa__) && !defined(__i386__) && \
-    !defined(__powerpc__) && !defined(__sparc64__)
+#if !defined(__alpha__) && !defined(__amd64__) && !defined(__hppa__) && \
+    !defined(__i386__) && !defined(__powerpc__) && !defined(__sparc64__)
        /*
         * Schedule a routine to be run at shutdown, by using atexit.
         * Cannot call atexit directly from ld.so?