Hi Florian, could you check strace -s 0 -p 301 ? It should attach to the running connman-vpnd and you'll get which command it's currently in. If it's idle, it should be some "accept" call. If strace is not available, install package "strace" (if that's possible without networking :P). >Can't load /gnu/store/vclzrvbxac8ipc8g1ncq5gjjj8gdvxw3-connman-1.38/lib/connman/plugins-vpn/wireguard.so: /gnu/store/vclzrvbxac8ipc8g1ncq5gjjj8gdvxw3-connman-1.38/lib/connman/plugins-vpn/wireguard.so: undefined symbol: __vpn_ipconfig_foreach No idea how that can happen... I've checked guix master connman and there, $ objdump -t /gnu/store/k6iw9mhqjkhq7626a7sgfn0qpg9m73qh-connman-1.38/sbin/connman-vpnd |grep __vpn_ipconfig_foreach 0000000000418480 l F .text 000000000000006b __vpn_ipconfig_foreach ... so that symbol is indeed defined. And wireguard.so has: 0000000000000000 *UND* 0000000000000000 __vpn_ipconfig_foreach But that should be resolved by the loader since wireguard.so is loaded by connman-vpnd--which has the definition of the symbol. And I've checked the same from the installer iso image: connman-vpnd: 0000000000418480 l F .text 000000000000006b __vpn_ipconfig_foreach wireguard.so: 0000000000000000 *UND* 0000000000000000 __vpn_ipconfig_foreach The small "l" means "local". That's probably not good. I've also tried a small program of my own: $ cat a1.c #include #include #include void foo(void) { exit(1); } int main() { if (dlopen("li.so", RTLD_NOW)) return 0; else { fprintf(stderr, "error: %s\n", dlerror()); return 1; } } $ cat li.c void foo(void); void bar(void) { foo(); } $ gcc -fPIC -shared -o li.so li.c $ gcc -o a1 -Wl,--export-dynamic a1.c -ldl $ objdump -t a.out |grep foo 00000000004011a0 g F .text 000000000000000e foo $ objdump -t li.so |grep foo 0000000000000000 *UND* 0000000000000000 foo $ ./a.out && echo ok ok So it should work?! Since you didn't try to use wireguard, it's probably unrelated--but maybe it's a follow-up error to that one.