To be precise, C's main() function is being called from the C Runtime (aka CRT0). The CRT is a wrapper around your program that handles the initialization of the state of the program and environment. After initializing interrupt vector, global and static variables, etc. it calls main(). Upon return from main(), the CRT's exit() procedures takes care of cleanup.
CRT0 itself is called by the SYNC Interrupt, which is fired upon reset. The first function is the start() function, which is the interrupt handler for the SYNC event (IRQ 0).
You can have a look at CRT0 here:
https://github.com/adapteva/epiphany-ne ... any/crt0.S