A SIGBUS that always happens in the same place is usually an alignment
problem.  Unless you're manipulating pointers manually, there may be a
compiler bug.  I would look at the specific instruction that fails.  If it's a
load or store instruction, check that the memory address is aligned properly
for a double.  The CPU and kernel can automatically correct that in many cases
(if that's turned on) but not all.  Floating point instructions often have
more strict requirements.

Every failed instruction that I've seen was either ldr or vldr.  I'll check the memory alignment next time I'm able to. How is that feature enabled in the kernel?

I'm hesitant to blame a compiler bug until I've exhausted all other possibilities. I did once find a bug in Microsoft's Visual Studio - but bugs in my own code are significantly more common!