Module Name: src Committed By: pooka Date: Thu Feb 24 12:25:45 UTC 2011
Modified Files: src/lib/librumpclient: rumpclient.c src/lib/librumphijack: hijack.c Log Message: Make the rumphijack dlsym trampoline call from rumpclient a "real" function call instead of a call through a function pointer. Apparently powerpc ld.elf_so gets __hackish_return_address() wrong if the call is done through a function pointer (digging deeper into that stuff is beyond my interest). Thanks to riz for providing access to a macppc for debugging. Unthanks to the broken toolchain in the default installation which wasted approximately 4 hours of time last night. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/lib/librumpclient/rumpclient.c cvs rdiff -u -r1.66 -r1.67 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/librumpclient/rumpclient.c diff -u src/lib/librumpclient/rumpclient.c:1.34 src/lib/librumpclient/rumpclient.c:1.35 --- src/lib/librumpclient/rumpclient.c:1.34 Thu Feb 24 09:52:34 2011 +++ src/lib/librumpclient/rumpclient.c Thu Feb 24 12:25:44 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpclient.c,v 1.34 2011/02/24 09:52:34 pooka Exp $ */ +/* $NetBSD: rumpclient.c,v 1.35 2011/02/24 12:25:44 pooka Exp $ */ /* * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved. @@ -717,7 +717,16 @@ return 0; } -void *(*rumpclient_dlsym)(void *, const char *); +void *rumpclient__dlsym(void *, const char *); +void *rumphijack_dlsym(void *, const char *); +void * +rumpclient__dlsym(void *handle, const char *symbol) +{ + + return dlsym(handle, symbol); +} +__weak_alias(rumphijack_dlsym,rumpclient__dlsym); + static int init_done = 0; int @@ -734,18 +743,14 @@ sigfillset(&fullset); - /* dlsym overrided by rumphijack? */ - if (!rumpclient_dlsym) - rumpclient_dlsym = dlsym; - /* * sag mir, wo die symbol sind. zogen fort, der krieg beginnt. * wann wird man je verstehen? wann wird man je verstehen? */ #define FINDSYM2(_name_,_syscall_) \ - if ((host_##_name_ = rumpclient_dlsym(RTLD_NEXT, \ + if ((host_##_name_ = rumphijack_dlsym(RTLD_NEXT, \ #_syscall_)) == NULL) { \ - if (rumpclient_dlsym == dlsym) \ + if (rumphijack_dlsym == dlsym) \ host_##_name_ = _name_; /* static fallback */ \ else \ errx(1, "cannot find %s: %s", #_syscall_, \ Index: src/lib/librumphijack/hijack.c diff -u src/lib/librumphijack/hijack.c:1.66 src/lib/librumphijack/hijack.c:1.67 --- src/lib/librumphijack/hijack.c:1.66 Wed Feb 23 15:44:38 2011 +++ src/lib/librumphijack/hijack.c Thu Feb 24 12:25:44 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: hijack.c,v 1.66 2011/02/23 15:44:38 pooka Exp $ */ +/* $NetBSD: hijack.c,v 1.67 2011/02/24 12:25:44 pooka Exp $ */ /*- * Copyright (c) 2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: hijack.c,v 1.66 2011/02/23 15:44:38 pooka Exp $"); +__RCSID("$NetBSD: hijack.c,v 1.67 2011/02/24 12:25:44 pooka Exp $"); #define __ssp_weak_name(fun) _hijack_ ## fun @@ -429,10 +429,8 @@ rcinit(void) { char buf[1024]; - extern void *(*rumpclient_dlsym)(void *, const char *); unsigned i, j; - rumpclient_dlsym = rumphijack_dlsym; host_fork = dlsym(RTLD_NEXT, "fork"); host_daemon = dlsym(RTLD_NEXT, "daemon"); host_execve = dlsym(RTLD_NEXT, "execve");