Browse Source

Demonstrate that dlopen() RTLD_NOW is currently broken.
-Erik

Eric Andersen 22 years ago
parent
commit
2a272e8265
3 changed files with 57 additions and 2 deletions
  1. 1 0
      test/ldso/.cvsignore
  2. 6 2
      test/ldso/Makefile
  3. 50 0
      test/ldso/dltest2.c

+ 1 - 0
test/ldso/.cvsignore

@@ -1,2 +1,3 @@
 dltest
 libhowdy.so
+dltest2

+ 6 - 2
test/ldso/Makefile

@@ -20,7 +20,11 @@ TESTDIR=../
 include $(TESTDIR)/Rules.mak
 
 CFLAGS+=--uclibc-ctors
-all: dltest libhowdy.so run
+all: dltest2 dltest libhowdy.so run
+
+dltest2: dltest.c
+	$(CC) $(CFLAGS) dltest2.c -o dltest2 -ldl
+	./dltest2
 
 dltest.o: dltest.c
 	$(CC) $(CFLAGS) -c dltest.c -o dltest.o
@@ -39,4 +43,4 @@ run: dltest libhowdy.so
 	./dltest
 
 clean:
-	rm -f *.o *.so dltest core libhowdy.so
+	rm -f *.o *.so dltest2 dltest core libhowdy.so

+ 50 - 0
test/ldso/dltest2.c

@@ -0,0 +1,50 @@
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dlfcn.h>
+#include "thread_db.h"
+
+extern void _dlinfo();
+
+int main(int argc, char **argv) {
+	void *handle;
+	td_err_e (*td_init_p) (void);
+
+	fprintf(stderr, "Attempting to dlopen() libthread_db.so with RTLD_NOW\n");
+	handle = dlopen ("libthread_db.so", RTLD_NOW);
+	if (!handle) {
+		fputs (dlerror(), stderr);
+		exit(1);
+	}
+
+	td_init_p = dlsym (handle, "td_init");
+	if (td_init_p == NULL) {
+	    fprintf(stderr, "yipe!  td_init() failed!\n");
+	    return EXIT_FAILURE;
+	}
+#if 0 //def __UCLIBC__
+	_dlinfo();   /* not supported by ld.so.2 */
+#endif
+	dlclose(handle);
+
+
+	fprintf(stderr, "Attempting to dlopen() libthread_db.so with RTLD_LAZY\n");
+	handle = dlopen ("libthread_db.so", RTLD_LAZY);
+	if (!handle) {
+		fputs (dlerror(), stderr);
+		exit(1);
+	}
+
+	td_init_p = dlsym (handle, "td_init");
+	if (td_init_p == NULL) {
+	    fprintf(stderr, "yipe!  td_init() failed!");
+	    return EXIT_FAILURE;
+	}
+#if 0 //def __UCLIBC__
+	_dlinfo();   /* not supported by ld.so.2 */
+#endif
+	dlclose(handle);
+
+	fprintf(stderr, "Everything worked as expected.\n");
+	return EXIT_SUCCESS;
+}