diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h index 1664c19bd247aa747fcd6d05b90f04b57e5b6379..92aa8b4c649e6816e7b6ca3b69b410814a970456 100644 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h @@ -2183,8 +2183,24 @@ struct kernel_statfs { /* In the child, now. Call "fn(arg)". */ "ldr r0,[sp, #4]\n" + + /* When compiling for Thumb-2 the "MOV LR,PC" here + * won't work because it loads PC+4 into LR, + * whereas the LDR is a 4-byte instruction. + * This results in the child thread always + * crashing with an "Illegal Instruction" when it + * returned into the middle of the LDR instruction + * The instruction sequence used instead was + * recommended by + * "https://wiki.edubuntu.org/ARM/Thumb2PortingHowto#Quick_Reference". + */ + #ifdef __thumb2__ + "ldr r7,[sp]\n" + "blx r7\n" + #else "mov lr,pc\n" "ldr pc,[sp]\n" + #endif /* Call _exit(%r0). */