commit 29237e85c3e5a0e5000ec5dd8d9d4c4d70f0e54c from: Sergey Bronnikov via: Sergey Bronnikov date: Mon Feb 12 16:36:18 2024 UTC Add a repro of difference in unloading libraries behaviour 1. https://www.reddit.com/r/C_Programming/comments/v07l1v/glibc_vs_musl_vs_netbsd_libc_an_example_with/ commit - d9f06d8cf9d186a8ab53e4d8c31d2529c2c027f1 commit + 29237e85c3e5a0e5000ec5dd8d9d4c4d70f0e54c blob - /dev/null blob + 2bae66a0e239d40650a31f6d36851e90b886de94 (mode 644) --- /dev/null +++ glibc-vs-musl/Makefile @@ -0,0 +1,18 @@ +# requires musl-gcc, see https://www.musl-libc.org/how.html + +all: build_glibc build_musl + +build_glibc: + @echo "Build with GLibc" + @gcc -fpic -shared -o liba.so a.c + @gcc -o main main.c + @./main + +build_musl: + @echo "Build with Musl" + @musl-gcc -fpic -shared -o liba.so a.c + @musl-gcc -o main main.c + @./main + +clean: + rm -f main liba.so blob - /dev/null blob + 5568637a04fea00e27fd7f38493428db11b1da30 (mode 644) --- /dev/null +++ glibc-vs-musl/a.c @@ -0,0 +1,20 @@ +/* a.c */ + +#include "stdio.h" + +const char* s = "-_-"; +int i = 0; + +__attribute__((constructor)) +static void before() { + printf("=^"); +} + +void f() { + printf("%c", s[i++]); +} + +__attribute__((destructor)) +static void after() { + printf("^=\n"); +} blob - /dev/null blob + 94bd7c6417fabf0e4305a14e2360b14d014e0e2e (mode 755) Binary files /dev/null and glibc-vs-musl/liba.so differ blob - /dev/null blob + 8a963b72693ff66ee16f986c0c2f988afa112a36 (mode 755) Binary files /dev/null and glibc-vs-musl/main differ blob - /dev/null blob + 6defd3e084d82dea0ec7c19c2ade5e29aaacabfa (mode 644) --- /dev/null +++ glibc-vs-musl/main.c @@ -0,0 +1,13 @@ +/* main.c */ + +#include "dlfcn.h" + +int main() +{ + for (int i = 0; i < 3; i++) { + void* a = dlopen("./liba.so", RTLD_LAZY); + void(*f)() = dlsym(a, "f"); + f(); + dlclose(a); + } +}