Merge branch 'tlssym' into 'master'

Fix dlsym of TLS variables

See merge request redox-os/relibc!327
This commit is contained in:
Jeremy Soller
2021-01-05 23:03:10 +00:00
7 changed files with 145 additions and 22 deletions
+11
View File
@@ -227,12 +227,23 @@ DYNAMIC_FLAGS+=\
-lc
DEPS=../sysroot
else
DYNAMIC_FLAGS+=\
-Wl,-rpath=\$$ORIGIN
endif
bins_static/%: %.c $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(STATIC_FLAGS)
bins_dynamic/%.so: %.c $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" -shared -fpic $(FLAGS) $(DYNAMIC_FLAGS)
bins_dynamic/dlfcn: dlfcn.c bins_dynamic/sharedlib.so $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
bins_dynamic/%: %.c $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
+88 -14
View File
@@ -5,24 +5,98 @@
int add(int a, int b)
{
return a + b;
return a + b;
}
void test_dlopen_null()
{
void* handle = dlopen(NULL, RTLD_LAZY);
if (!handle) {
printf("dlopen(NULL) failed\n");
exit(1);
}
int (*f)(int, int) = dlsym(handle, "add");
if (!f) {
printf("dlsym(handle, add) failed\n");
exit(2);
}
int a = 22;
int b = 33;
printf("add(%d, %d) = %d\n", a, b, f(a, b));
dlclose(handle);
}
void test_dlopen_libc()
{
void* handle = dlopen("libc.so.6", RTLD_LAZY);
if (!handle) {
printf("dlopen(libc.so.6) failed\n");
exit(1);
}
int (*f)(const char*) = dlsym(handle, "puts");
if (!f) {
printf("dlsym(handle, puts) failed\n");
exit(2);
}
f("puts from dlopened libc");
dlclose(handle);
}
void test_dlsym_function()
{
void* handle = dlopen("sharedlib.so", RTLD_LAZY);
if (!handle) {
printf("dlopen(sharedlib.so) failed\n");
exit(1);
}
void (*f)() = dlsym(handle, "print");
if (!f) {
printf("dlsym(handle, print) failed\n");
exit(2);
}
f();
dlclose(handle);
}
void test_dlsym_global_var()
{
void* handle = dlopen("sharedlib.so", RTLD_LAZY);
if (!handle) {
printf("dlopen(sharedlib.so) failed\n");
exit(1);
}
int* global_var = dlsym(handle, "global_var");
if (!global_var) {
printf("dlsym(handle, global_var) failed\n");
exit(2);
}
printf("main: global_var == %d\n", *global_var);
dlclose(handle);
}
void test_dlsym_tls_var()
{
void* handle = dlopen("sharedlib.so", RTLD_LAZY);
if (!handle) {
printf("dlopen(sharedlib.so) failed\n");
exit(1);
}
int* tls_var = dlsym(handle, "tls_var");
if (!tls_var) {
printf("dlsym(handle, tls_var) failed\n");
exit(2);
}
printf("main: tls_var == %d\n", *tls_var);
dlclose(handle);
}
int main()
{
void* handle = dlopen(NULL, RTLD_LAZY);
if (!handle) {
printf("dlopen(NULL) failed\n");
exit(1);
}
int (*f)(int, int) = dlsym(handle, "add");
if (!f) {
printf("dlsym(handle, add) failed\n");
exit(2);
}
int a = 22;
int b = 33;
printf("add(%d, %d) = %d\n", a, b, f(a, b));
test_dlopen_null();
test_dlopen_libc();
test_dlsym_function();
test_dlsym_global_var();
test_dlsym_tls_var();
}
+5
View File
@@ -1 +1,6 @@
add(22, 33) = 55
puts from dlopened libc
sharedlib: global_var == 42
sharedlib: tls_var == 21
main: global_var == 42
main: tls_var == 21
+10
View File
@@ -0,0 +1,10 @@
#include <stdio.h>
int global_var = 42;
_Thread_local int tls_var = 21;
void print()
{
fprintf(stdout, "sharedlib: global_var == %d\n", global_var);
fprintf(stdout, "sharedlib: tls_var == %d\n", tls_var);
}