Using AT with --oformat binary results in the linker printing errors the size of the .data section exceeding the size of flash.
It seems that the linker is swapping the load address with the ram address, since replacing >ram AT >flash with >flash AT >ram in the .data section of a minimal linker script eliminates the issue (and results in a binary that runs normally). Keeping > ram AT > flash in the script and reducing address of the ram memory region results in the error about the size being exceeded (flash address is 0) disappearing and a binary with a size slightly larger than the ram address being generated (which is exactly what would be expected if ram were being treated as the load address).
Someone mentioned this problem before (but with the other AT syntax and without the work around) here: #62728.