I don't think system-level static linking precludes loading code for e.g. extensions at runtime. Although admittedly I can't say I know any examples of doing that offhand, and in many ways you'd be building an limited ad-hoc dynamic linking system.
https://gitlab.redox-os.org/redox-os/redox/-/issues/927#note... implies that redox doesn't currently have dlopen(); while I agree that you hardly need dynamic linking for everything in order to support plugins, my meaning was that you need to allow at least some dynamic linking for it to work.
I guess you could include your own dynamic linker in your binary. Mmap the shared object, perform the relocations, etc. It seems like you could write a static library to do this so that the Redox itself doesn't need any specific support?
We took this approach with the first version of a from-scratch hypervisor at my last job. Portions of the hypervisor were separated into different shared libraries and we wrote a custom ELF loader to do the relocations. It was interesting but ultimately it was scratched in favor of a large static binary.