projects
/
libc-test
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix string_memset so buffers are aligned properly
[libc-test]
/
src
/
functional
/
dlopen.c
diff --git
a/src/functional/dlopen.c
b/src/functional/dlopen.c
index
3150f6f
..
ceee83e
100644
(file)
--- a/
src/functional/dlopen.c
+++ b/
src/functional/dlopen.c
@@
-1,47
+1,55
@@
#include <dlfcn.h>
#include "test.h"
#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);
{
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)
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)
i = dlsym(h, "i");
if (!i)
- error("dlsym i failed: %s\n", dlerror());
+
t_
error("dlsym i failed: %s\n", dlerror());
if (*i != 1)
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)
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)
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)
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)
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)
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)
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))
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;
}
}