Other answers have covered the PC side fairly well. I'll touch on some of the issues in the embedded world.
Embedded code does have something similar to a segfault. Code is stored in some kind of non-volatile storage (usually flash these days, but some kind of ROM or PROM in the past). Writing to this needs special operations to set it up; normal memory accesses can read from it but not write to it. In addition, embedded processors usually have large gaps in their memory maps. If the processor gets a write request for memory which is read-only, or if it gets a read or write request for an address which does not physically exist, the processor will usually throw a hardware exception. If you have a debugger connected, you can check the state of the system to find what went wrong, as with a core dump.
There's no guarantee that this will happen for a stack overflow though. The stack can be placed anywhere in RAM, and this will usually be alongside other variables. The result of stack overflow will usually be to corrupt those variables.
If your application also uses heap (dynamic allocation) then it is common to assign a section of memory where the stack begins at the bottom of that section and expands upwards, and the heap begins at the top of that section and expands downwards. Clearly this means dynamically-allocated data will be the first casualty.
If you're unlucky, you may not even notice when it happens, and then you need to work out why your code is not behaving correctly. In the most ironic case, if the data being overwritten is a pointer then you may still get a hardware exception when the pointer tries to access invalid memory - but this will be some time after the stack overflow and the natural assumption will usually be that it's a bug in your code.
Embedded code has a common pattern to deal with this, which is to "watermark" the stack by initialising every byte to a known value. Sometimes the compiler can do this; or sometimes you may need to implement it yourself in the startup code before main(). You can look back from the end of the stack to find where it is no longer set to this value, at which point you know the high-water-mark for stack usage; or if it is all incorrect then you know you have an overflow. It is common (and good practise) for embedded applications to poll this continuously as a background operation, and to be able to report it for diagnostic purposes.
Having made it possible to track stack usage, most companies will set an acceptable worst-case margin to avoid overflows. This is typically somewhere from 75% to 90%, but there will always be some spare. Not only does this allow for the possibility that there is a worse worst-case which you have not yet seen, but it also makes life easier for future development when new code needs to be added which uses more stack.