This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

dlsym() and RTLD_NEXT resolves wrong symbol


Hi,

I have a test file attached that wraps chown() (Yes, its a rough
test case).  If I use dlsym(dlopen("libc.so.6", RTLD_LAZY), "chown")
to find the chown symbol, it works fine.  If I though use
dlsym(RTLD_NEXT, "chown"), it seems to find 'lchown'.

---
~/tmp $ strace -f ./test-RTLD_LAZY 2>&1 | grep chown
chown32("blah", 0, 0)                   = -1 ENOENT (No such file or directory)
~/tmp $ strace -f ./test-RTLD_NEXT 2>&1 | grep chown
lchown32("blah", 0, 0)                  = -1 ENOENT (No such file or directory)
~/tmp $
---

--- glibc info ---
~/tmp $ /lib/libc-2.3.4.so
GNU C Library stable release version 2.3.4, by Roland McGrath et al.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.3.5
Compiled on a Linux 2.6.8 system on 2005-02-07.
Available extensions:
        GNU libio by Per Bothner
        crypt add-on version 2.1 by Michael Glad and others
        Native POSIX Threads Library by Ulrich Drepper et al
        BIND-8.2.3-T5B
        NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
---

Any ideas would be appreciated.


Thanks,

-- 
Martin Schlemmer


#define _GNU_SOURCE
#define _REENTRANT

#include <dlfcn.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

static int (*true_chown) (const char *, uid_t, gid_t);
extern int chown(const char *a, uid_t b, gid_t c) {
	printf("Hello There\n");
	return true_chown(a, b, c);
}

int main() {
#if 0
	void *libc_handle = dlopen("libc.so.6", RTLD_LAZY);
#else
	void *libc_handle = RTLD_NEXT;
#endif
	char *dlerror_msg = NULL;

	dlerror();
	true_chown = dlsym(libc_handle, "chown");
	if (NULL == true_chown) {
		dlerror_msg = dlerror();
		if (NULL != dlerror_msg)
			printf("%s\n", dlerror_msg);
		else
			printf("Error loading requested symbol!\n");
		exit(1);
	}
	
	chown("blah", 0, 0);
	return 0;
}

Attachment: signature.asc
Description: This is a digitally signed message part


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]