I used c++ without issue in a project for sam3x. Someone may have a better solution, but it appears the start up code is organised slightly different for sam3s and sam3x.
In the sam3x version, startup_sam3x.s branches to SystemInit in system_sam3x.c and when that returns, branches to __main in main.cpp.
Im guessing that for the sam3s, the function called within system_sam3s.c calls main when its finished setting up the system. If you removed that call it should return back into the assembly file and you can then call main from there
i.e.
Code:
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP