It looks like the underlying cause may be a bug in gas, which causes the wrong alignment to be set for code sections -- upstream binutils bug raised and cross-referenced from this bug.
When building firefox for Thumb, .text contains a mixture of Thumb code and ARM code (the ARM code comes from the */arm/*.asm files). The ARM code sections don't declare an appropriate alignment requirement in the objects output from the assembler, and end up in the final link aligned on an odd halfword offset.
Disassembling /usr/lib/firefox-5.0/libxul.so shows the boundary between compiler-generated Thumb code and the hand-written ARM assembler, with the ARM instructions on an invalid, non-word-aligned offset:
It looks like the underlying cause may be a bug in gas, which causes the wrong alignment to be set for code sections -- upstream binutils bug raised and cross-referenced from this bug.
When building firefox for Thumb, .text contains a mixture of Thumb code and ARM code (the ARM code comes from the */arm/*.asm files). The ARM code sections don't declare an appropriate alignment requirement in the objects output from the assembler, and end up in the final link aligned on an odd halfword offset.
Disassembling /usr/lib/ firefox- 5.0/libxul. so shows the boundary between compiler-generated Thumb code and the hand-written ARM assembler, with the ARM instructions on an invalid, non-word-aligned offset:
61e6f2: 9201 str r2, [sp, #4]
61e6f4: 6a5a ldr r2, [r3, #36] ; 0x24
61e6f6: 695b ldr r3, [r3, #20]
61e6f8: f42f efd0 blx 24e69c <_init+0x5da4>
61e6fc: bd0e pop {r1, r2, r3, pc}
0061e6fe <vp8_decode_ mb_tokens_ v6>:
61e6fe: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
61e702: e24dd040 sub sp, sp, #64 ; 0x40
61e706: e1a07001 mov r7, r1
61e70a: e1a09000 mov r9, r0