The _start symbol is the symbol to which the OS transfers control to a userspace program. The ABI of this function call is not the same ABI as a C function, so there's necessary code to translate those functions to main. Additionally, there's a decent amount of stuff that has to be done in main before you run _start, mainly running static constructors, and there's stuff that has to be done after main.
This code is provided by the C runtime. If you use gcc as the linker, the necessary object files to include _start are included in the link line. But when you drive the linker manually, you have to provide those libraries yourself.