If you really wanna get the entire experience start with system design and make a whole thing from the bottom up. For bootstrapping use erlang, java, racket etc as the intermediate language, and write an assembler and some kinda ISA on top, then make a higher level lang to run on top and for fun make a shell and or a gui to run on top...
When you're done and you come back to reality, if you went deep enough, software engineering as a thing becomes funny as it's a series of compromises to violently enforce coldwar era ideas based on a world that no longer exists...
I mean if I use GCC on Solaris 11.4, the compiler is going to output object code that I can run a linker against to get an executable and this whole thing ELF64 is a 1990s and 386UNIX thing that we still use because reasons but when you go thru the process of making your own whole thing maybe you too think ELF is stupid and you get to decide how the entire process of going from source to application goes!
I don't wanna spoil it but 10/10 worth it