Subject: Re: port-amd64/30570: dlopen(..., RTLD_NOW) always returns non-null
To: None <gnats-bugs@netbsd.org, port-amd64-maintainer@netbsd.org,>
From: Christos Zoulas <christos@zoulas.com>
List: netbsd-bugs
Date: 06/21/2005 00:22:57
On Jun 21,  4:16am, jlam@NetBSD.org (jlam@NetBSD.org) wrote:
-- Subject: port-amd64/30570: dlopen(..., RTLD_NOW) always returns non-null

| >Number:         30570
| >Category:       port-amd64
| >Synopsis:       dlopen(..., RTLD_NOW) always returns non-null
| >Confidential:   no
| >Severity:       serious
| >Priority:       high
| >Responsible:    port-amd64-maintainer
| >State:          open
| >Class:          sw-bug
| >Submitter-Id:   net
| >Arrival-Date:   Tue Jun 21 04:16:00 +0000 2005
| >Originator:     Johnny C. Lam
| >Release:        NetBSD 2.0_STABLE
| >Organization:
| 	The NetBSD Project
| >Environment:
| System: NetBSD er2.home.local 2.0_STABLE NetBSD 2.0_STABLE (ERACKS) #0: Mon Jan 3 00:12:46 EST 2005 jlam@er2.home.local:/local/sources/cvs.netbsd.org/netbsd-2/amd64/obj/sys/arch/amd64/compile/ERACKS amd64
| Architecture: x86_64
| Machine: amd64
| >Description:
| 	dlopen(..., RTLD_NOW) returns non-null, even if the shared module
| 	it is asked to open contains unresolved symbols.
| 
| >How-To-Repeat:
| 	The following is the exact test case used by the configure script
| 	in pkgsrc/chat/ircservices:
| 
| 	% cat test-dlopen.c
| 	#include <dlfcn.h>
| 	int main(int argc, char **argv) {
| 		void *lib = dlopen("./test-lib.so", RTLD_NOW);
| 		printf("%d\n", lib != 0);
| 		if (lib)
| 			dlclose(lib);
| 		return 0;
| 	}
| 
| 	% cat test-lib.c
| 	int foo() {no_such_symbol();}
| 
| 	% cc -fPIC test-dlopen.c -o test-dlopen
| 	% cc -shared -fPIC test-lib.c -o test-lib.so
| 	% ./test-dlopen
| 	1
| 
| 	I expected the "test-dlopen" program to print "0", as it did on
| 	the NetBSD-1.6.2/i386 system I also tested this on.
| 

Does this fix your problem?

christos

Index: reloc.c
===================================================================
RCS file: /cvsroot/src/libexec/ld.elf_so/reloc.c,v
retrieving revision 1.89
diff -u -u -r1.89 reloc.c
--- reloc.c	31 May 2005 19:30:38 -0000	1.89
+++ reloc.c	21 Jun 2005 04:22:32 -0000
@@ -192,7 +192,7 @@
 #endif
 #if defined(__i386__) || defined(__arm__) || defined(__hppa__) \
     || defined(__sparc64__) || defined(__sparc__) || defined(__alpha__) \
-    || defined(__sh3__)
+    || defined(__sh3__) || defined(__x86_64__)
 		if (bind_now) {
 			dbg(("doing immediate PLT binding"));
 			if (_rtld_relocate_plt_objects(obj) < 0)