On Fri, Oct 26, 2012 at 9:27 PM, David Miller <da...@davemloft.net> wrote: > > I'm getting a SIGBUS on every backtrace libbacktrace generates > on 32-bit sparc builds. The crashes usually happen in > add_function_range(), where 'p' is not 8-byte aligned. > > It seems that the vector code doesn't take care to align the pointers > it returns. I cribbed the size alignment done in mmap.c's > implementation of backtrace_alloc() to fix this.
Sorry about the problem, but I don't see how this can be the right fix. A single vector will always be an array of the same struct, so I don't see how any individual struct can be misaligned. It seems like increasing the requested size is just going to consistently misalign any struct that does not require 8 byte alignment, so later references into the vector using an index will fail. Also backtrace_vector_grow is based on top of backtrace_alloc, so again aligning the size shouldn't matter. The struct used by add_function_range is struct function_addrs { uint64_t low; uint64_t high; struct function *function; }; So on a 32-bit system, this should have a size of 20 if uint64_t requires 4-byte alignment, but it should have a size of 24 if uint64_t requires 8-byte alignment. It sounds like uint64_t requires 8-byte alignment, so the size of this struct should be 24, so your patch shouldn't change matters. Since your patch presumably works, it sounds like sizeof (struct function_addrs) is returning 20, but that does not make sense. It would mean that allocating an array of struct function_addrs wouldn't work correctly. So I don't know what is going on. Ian