|
Date: Sat, 1 Jan 2022 17:32:46 +0800 From: Sebastien Bourdeauducq <sb@...abs.hk> To: musl@...ts.openwall.com Subject: building statically linked DSOs with musl Dear musl libc developers, I'm trying to build a shared library that is itself statically linked. The reason for doing that is building a Python plug-in, which contains complex dependencies such as LLVM, and which should use a custom malloc everywhere. Dynamic linking doesn't work in my case as the malloc & co symbols are already resolved by Python when my plugin is loaded, and replacing all malloc & co calls in LLVM, libstdc++, etc. with a differently named function seems pretty difficult. Naturally I've come to musl libc, since glibc comes with a bunch of nonsense when attempting to link against it statically. For simple code this goes reasonably well: $ nix-shell -p pkgsMusl.clang_13 $ cat staticlib.c #include <stdio.h> void test_func() { puts("hello world"); } $ clang -o libstaticlib.so -shared staticlib.c -fPIC -Wl,-Bstatic -lc $ ldd libstaticlib.so statically linked The "test" program below is built with and linked against glibc, as would be the case in my Python plugin situation. $ nix-shell -p clang_13 $ cat test.c #include <stdio.h> void test_func(); int main() { test_func(); return 0; } $ clang -o test -L. -lstaticlib test.c $ ldd test linux-vdso.so.1 (0x00007ffd4db5a000) libstaticlib.so => not found libc.so.6 => /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/libc.so.6 (0x00007fbb29746000) /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/ld-linux-x86-64.so.2 => /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib64/ld-linux-x86-64.so.2 (0x00007fbb2990d000) $ LD_LIBRARY_PATH=. ./test hello world So far, so good. But trouble begins when calling certain musl functions from the library: $ cat staticlib.c #include <stdio.h> #include <sys/time.h> void test_func() { struct timeval tv; gettimeofday(&tv, NULL); printf("%ld", tv.tv_sec); } $ clang -o libstaticlib.so -shared staticlib.c -fPIC -Wl,-Bstatic -lc $ LD_LIBRARY_PATH=. ./test Segmentation fault (core dumped) (gdb) backtrace #0 0x00007ffff7fbf527 in __vdsosym () from ./libstaticlib.so #1 0x00007ffff7fbf439 in cgt_init () from ./libstaticlib.so #2 0x00007ffff7fbf47d in clock_gettime () from ./libstaticlib.so #3 0x00007ffff7fbedba in gettimeofday () from ./libstaticlib.so #4 0x00007ffff7fbd2c5 in test_func () from ./libstaticlib.so #5 0x0000000000401138 in main () Has anyone encountered this and would have an explanation or fix? Thanks, Sébastien
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.