For the memory operand, clang passes in an address relative to the
authornaddy <naddy@openbsd.org>
Sun, 4 Jun 2017 14:20:12 +0000 (14:20 +0000)
committernaddy <naddy@openbsd.org>
Sun, 4 Jun 2017 14:20:12 +0000 (14:20 +0000)
stack pointer.  We cannot use this twice while pushing values on
the stack.  Instead load the operand address into a register and
use this as base address.  Use %edx since it is already marked as
clobbered.  Also fixes a syntax problem for clang.
ok mlarkin@

libexec/ld.so/i386/rtld_machine.c

index 027a7a3..4390b0d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rtld_machine.c,v 1.36 2017/01/24 07:48:37 guenther Exp $ */
+/*     $OpenBSD: rtld_machine.c,v 1.37 2017/06/04 14:20:12 naddy Exp $ */
 
 /*
  * Copyright (c) 2002 Dale Rahn
@@ -397,7 +397,8 @@ _dl_bind(elf_object_t *object, int index)
        {
                register long syscall_num __asm("eax") = SYS_kbind;
 
-               __asm volatile("pushl 4 %3; pushl %3; pushl %2; pushl %1;"
+               __asm volatile("lea %3, %%edx; pushl 4(%%edx);"
+                   " pushl (%%edx); pushl %2; pushl %1;"
                    " push %%eax; int $0x80; addl $20, %%esp" :
                    "+a" (syscall_num) : "r" (&buf), "i" (sizeof(buf)),
                    "m" (cookie) : "edx", "cc", "memory");