There are a couple of things to note here:
In C, the leading underscore in a function's name is added implicitly by the compiler. So, a function func() in your code is renamed to _func() internally, and this is how it appears in the object file (when you do e-objdump these are the names you see). Thus, you should call your startup function as "start()" instead.
The bigger problem is that on the Epiphany, the start() function, being the first to be invoked after reset (or SYNC interrupt, to be more precise) should be mapped to the first vector in the IVT (address 0x00000000). Thus, the function itself should contain only one instruction which is the "b <addr-of-the-actual-function>" branch instruction. Alternatively, you should put that "b" instruction in the IVT manually (as a replacement for CRT0) and use your start() as the target address.
The current program flow, with the default stdlib is:
_start() - the IVT entry
.normal_start() - the actual start() function, which merely jumps to:
_epiphany_start() - initialization of stack and buffers, then jump to
main()
and you can see how it's done in file "libgloss/epiphany/crt0.S" in the epiphany-sourceware repo: