`dlopen` is provided by `libdl`, but behind the scenes, with the GNU C library implementation at least, the latter relies on symbols provided by `ld-linux.so` to perform the dynamic linking. If `dlopen` is called from a dynamically-linked program, `ld-linux.so` is already loaded, so it uses those symbols directly; if it’s called from a statically-linked program, it tries to load `ld-linux.so`.