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.