On Fri, Feb 25, 2011 at 16:01:42 +0000, Antti Kantee wrote: > Module Name: src > Committed By: pooka > Date: Fri Feb 25 16:01:42 UTC 2011 > > Modified Files: > src/lib/librumphijack: Makefile hijackdlsym.c > > Log Message: > Ok, for reasons I can't begin to understand, the binaries I tested > yesterday on powerpc broke overnight. Apparently adding one more > function before the call to dlsym() fixes things again. I hope > I don't have to add another one tomorrow .... > > > To generate a diff of this commit: > cvs rdiff -u -r1.7 -r1.8 src/lib/librumphijack/Makefile > cvs rdiff -u -r1.1 -r1.2 src/lib/librumphijack/hijackdlsym.c
I think this is caused by revision 1.121 of rtld.c (hi, mac!) that added "hackish_return_address" for ppc. #ifdef __powerpc__ static void * hackish_return_address(void) { return __builtin_return_address(1); } #endif void * dlsym(void *handle, const char *name) { ... #ifdef __powerpc__ retaddr = hackish_return_address(); #else retaddr = __builtin_return_address(0); #endif ... } hackish_return_address will be inlined (simple static function) and, as far as I can tell, gcc does NOT adjust the "level" argument to __builtin_return_address. The net effect is that dlsym uses caller's caller address to detect which module the call comes from, and if caller's caller is in a different module wrong things happen. That explains why you need an extra frame. -uwe