That definition will make the _stack_start symbol point to the very end of RAM. It's simplest to add a section for the stack, like you did for the heap.
.stack ORIGIN(RAM):
{
_stack_end = .;
ASSERT(stack_size % 8 == 0, "Stack size must be multiple of 8 bytes long")
. = . + stack_size;
__stack_start = .;
} > RAM
The assert just ensures the stack pointer is DWORD-aligned, as mandated by the ABI.