I think your last paragraph is wrong. crt0.o is static even when linking to libc.so dynamically. The ELF format has something in the headers for an entry point which will point at _start in your own binary, not in libc.so.
I'm pretty sure it works that way on windows too, but they call the symbol mainCRTStartup or some such.