Module Name:    src
Committed By:   pooka
Date:           Mon Feb  7 19:34:39 UTC 2011

Modified Files:
        src/lib/librumphijack: hijack.c

Log Message:
Force gcc to generate a stack frame for the call to dlsym(RTLD_NEXT).
Without this hack at least amd64 -O2 just used jmp and The Wrong
Thing happened.


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/lib/librumphijack/hijack.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumphijack/hijack.c
diff -u src/lib/librumphijack/hijack.c:1.31 src/lib/librumphijack/hijack.c:1.32
--- src/lib/librumphijack/hijack.c:1.31	Mon Feb  7 12:23:05 2011
+++ src/lib/librumphijack/hijack.c	Mon Feb  7 19:34:39 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: hijack.c,v 1.31 2011/02/07 12:23:05 pooka Exp $	*/
+/*      $NetBSD: hijack.c,v 1.32 2011/02/07 19:34:39 pooka Exp $	*/
 
 /*-
  * Copyright (c) 2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: hijack.c,v 1.31 2011/02/07 12:23:05 pooka Exp $");
+__RCSID("$NetBSD: hijack.c,v 1.32 2011/02/07 19:34:39 pooka Exp $");
 
 #define __ssp_weak_name(fun) _hijack_ ## fun
 
@@ -174,12 +174,25 @@
 /*
  * This is called from librumpclient in case of LD_PRELOAD.
  * It ensures correct RTLD_NEXT.
+ *
+ * ... except, it's apparently extremely difficult to force
+ * at least gcc to generate an actual stack frame here.  So
+ * sprinkle some volatile foobar and baz to throw the optimizer
+ * off the scent and generate a variable assignment with the
+ * return value.  The posterboy for this meltdown is amd64
+ * with -O2.  At least with gcc 4.1.3 i386 works regardless of
+ * optimization.
  */
+volatile int rumphijack_unrope; /* there, unhang yourself */
 static void *
 hijackdlsym(void *handle, const char *symbol)
 {
+	void *rv;
+
+	rv = dlsym(handle, symbol);
+	rumphijack_unrope = *(volatile int *)rv;
 
-	return dlsym(handle, symbol);
+	return (void *)rv;
 }
 
 /* low calorie sockets? */

Reply via email to