ARM only allows aligned accesses. GCC generated unaligned accesses for the copy buffer, but ARM forces alignment, causing the first two bytes to be trampled. I changed the mechanism to create two temporaries and memcpy them in. It now works on ARM (and x86) for large websocket chunks.