fix string_memset so buffers are aligned properly
[libc-test] / src / functional / dlopen.c
index 3150f6f..ceee83e 100644 (file)
@@ -1,47 +1,55 @@
 #include <dlfcn.h>
 #include "test.h"
 
-int main()
+int main(int argc, char *argv[])
 {
        void *h, *g;
        int *i, *i2;
        char *s;
        void (*f)(void);
+       char buf[512];
 
-       h = dlopen("./dlopen_dso.so", RTLD_LAZY|RTLD_LOCAL);
+       if (!t_pathrel(buf, sizeof buf, argv[0], "dlopen_dso.so")) {
+               t_error("failed to obtain relative path to dlopen_dso.so\n");
+               return 1;
+       }
+       h = dlopen(buf, RTLD_LAZY|RTLD_LOCAL);
        if (!h)
-               error("dlopen ./dlopen_dso.so failed: %s\n", dlerror());
+               t_error("dlopen %s failed: %s\n", buf, dlerror());
        i = dlsym(h, "i");
        if (!i)
-               error("dlsym i failed: %s\n", dlerror());
+               t_error("dlsym i failed: %s\n", dlerror());
        if (*i != 1)
-               error("initialization failed: want i=1 got i=%d\n", *i);
+               t_error("initialization failed: want i=1 got i=%d\n", *i);
        f = (void (*)(void))dlsym(h, "f");
        if (!f)
-               error("dlsym f failed: %s\n", dlerror());
+               t_error("dlsym f failed: %s\n", dlerror());
        f();
        if (*i != 2)
-               error("f call failed: want i=2 got i=%d\n", *i);
-       if (dlclose(h))
-               error("dlclose failed: %s\n", dlerror());
+               t_error("f call failed: want i=2 got i=%d\n", *i);
 
        g = dlopen(0, RTLD_LAZY|RTLD_LOCAL);
        if (!g)
-               error("dlopen 0 failed: %s\n", dlerror());
+               t_error("dlopen 0 failed: %s\n", dlerror());
        i2 = dlsym(g, "i");
        s = dlerror();
        if (i2 || s == 0)
-               error("dlsym i should have failed\n");
-       if (dlsym(g, "main") == 0)
-               error("dlsym main failed: %s\n", dlerror());
+               t_error("dlsym i should have failed\n");
+       if (dlsym(g, "main") != (void*)main)
+               t_error("dlsym main failed: %s\n", dlerror());
 
-       h = dlopen("./dlopen_dso.so", RTLD_LAZY|RTLD_GLOBAL);
+       /* close+open reinitializes the dso with glibc but not with musl */
+       h = dlopen(buf, RTLD_LAZY|RTLD_GLOBAL);
        i2 = dlsym(g, "i");
        if (!i2)
-               error("dlsym i failed: %s\n", dlerror());
+               t_error("dlsym i failed: %s\n", dlerror());
+       if (i2 != i)
+               t_error("reopened dso should have the same symbols, want %p, got %p\n", i, i2);
        if (*i2 != 2)
-               error("want i2=2, got i2=%d\n", *i2);
+               t_error("reopened dso should have the same symbols, want i2==2, got i2==%d\n", *i2);
        if (dlclose(g))
-               error("dlclose failed: %s\n", dlerror());
-       return test_status;
+               t_error("dlclose failed: %s\n", dlerror());
+       if (dlclose(h))
+               t_error("dlclose failed: %s\n", dlerror());
+       return t_status;
 }