Browse Source

add $ORIGIN test-case

Signed-off-by: Leonid Lisovskiy <lly.dev@gmail.com>
Signed-off-by: Waldemar Brodkorb <wbx@uclibc-ng.org>
Waldemar Brodkorb 8 years ago
parent
commit
7c1b847a49
2 changed files with 48 additions and 1 deletions
  1. 11 1
      test/dlopen/Makefile.in
  2. 37 0
      test/dlopen/tst-origin.c

+ 11 - 1
test/dlopen/Makefile.in

@@ -5,7 +5,7 @@
 export UCLIBC_ONLY := 1
 
 TESTS := dltest dltest2 dlstatic test1 test2 test3 dlundef dlafk dladdr \
-	testscope nodelete
+	testscope nodelete tst-origin
 
 ifneq ($(HAVE_SHARED),y)
 TESTS_DISABLED := test3
@@ -25,10 +25,19 @@ LDFLAGS_test2    := -ldl
 LDFLAGS_test3    := -ldl ./libtest1.so ./libtest2.so -Wl,-rpath,.
 LDFLAGS_dladdr   := -ldl
 LDFLAGS_testscope:= -ldl
+LDFLAGS_tst-origin:= -ldl -Wl,-rpath,\$$ORIGIN/testlib
 
 DEBUG_LIBS := X
 WRAPPER := env $(DEBUG_LIBS)=all LD_LIBRARY_PATH="$$PWD:.:$(LD_LIBRARY_PATH)"
 
+testlib:
+	@mkdir $@
+
+testlib/libtest31.so: libtest3.so | testlib
+	@cp $^ $@
+
+EXTRA_DIRS := testlib
+
 # Build libC.so without -mprefergot compilation flag to force a
 # R_SH_JMP_SLOT relocation instead of R_SH_GLOB_DAT for _libC_fini. This is
 # needed to resolve the _libC_fini symbol when used (by libC.so destructor),
@@ -53,6 +62,7 @@ LDFLAGS_libafk.so := ./libafk-temp.so -Wl,-rpath,.
 test1: libtest1.so
 test2: libtest1.so libtest2.so
 test3: libtest1.so libtest2.so
+tst-origin: testlib/libtest31.so
 libtest1.so: libtest2.so
 libB.so: libC.so
 libA.so: libB.so

+ 37 - 0
test/dlopen/tst-origin.c

@@ -0,0 +1,37 @@
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dlfcn.h>
+
+#ifdef __UCLIBC__
+extern void _dlinfo(void);
+#endif
+
+int main(int argc, char **argv) {
+	void *h1, *h2;
+	int (*mydltest)(const char *s);
+	char *error;
+
+	h1 = dlopen ("libtest31.so", RTLD_LAZY);
+	if (!h1) {
+		fprintf(stderr, "Could not open libtest31.so: %s\n", dlerror());
+		exit(1);
+	}
+
+	h2 = dlopen ("libtest31.so", RTLD_NOLOAD);
+	if (!h2) {
+		fprintf(stderr, "Could not open libtest31.so(RTLD_NOLOAD): %s\n", dlerror());
+		exit(1);
+	}
+
+	mydltest = dlsym(h1, "dltest");
+	if ((error = dlerror()) != NULL)  {
+		fprintf(stderr, "Could not locate symbol 'dltest': %s\n", error);
+		exit(1);
+	}
+
+	dlclose(h2);
+	dlclose(h1);
+
+	return EXIT_SUCCESS;
+}