linux-mips
[Top] [All Lists]

problems with dlsym() on MIPS, looking for advice

To: linux-mips@linux-mips.org
Subject: problems with dlsym() on MIPS, looking for advice
From: "Chris Friesen" <cfriesen@nortel.com>
Date: Mon, 26 May 2008 11:51:56 -0600
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mozilla Thunderbird 1.0.2-6 (X11/20050513)
I think this is a userspace/toolchain issue, so if that's offtopic for this list please let me know of a better resource.

We're using glibc 2.3.6 and gcc 3.4.4. We've got some library code (that gets preloaded for debugging) something like this:

ee_sigaction_fptr = dlsym(RTLD_DEFAULT, "sigaction"); if (ee_sigaction_fptr == sigaction) ee_sigaction_fptr = dlsym(RTLD_NEXT, "sigaction");

We have declared our own sigaction procedure which is extern in this code. On non-MIPS arches (powerpc, x86, x86_64) the RTLD_DEFAULT call returns the address of our external procedure and the RTLD_NEXT call returns the real sigaction address in its appropriate library.

On MIPS, the DEFAULT returns the address of this libraries undefined symbol for the extern and NEXT returns our external procedure. Putting in a second RTLD_NEXT call returned the real sigaction address.

This worked for most procedures we are looking for. However, during booting, we have an app that uses a specific library which has an extern for sigaction as well and now in the preloaded code we need a fourth call to dlsym to skip that one.

We tried recoding the above debug code to do one DEFAULT call and a loop of NEXT calls until it returns NULL. It didn't. It just kept returning the last pointer all the time.

Has anyone seen anything like this? Is there a known issue with dlsym() and certain toolchains? (Maybe something like "http://busybox.net/lists/uclibc/2007-January/017150.html";?)


Any help you can provide would be appreciated.

Thanks,

Chris

<Prev in Thread] Current Thread [Next in Thread>
  • problems with dlsym() on MIPS, looking for advice, Chris Friesen <=