The "chk_guard_add" pattern used for loading the GOT slot address for __stack_chk_guard hard-codes use of r12 as a fixed GOT register and thus is not suitable for FDPIC, where the saved initial value of r12 from function entry is what we need.
I would actually prefer removing this hack entirely if possible. I tried non-FDPIC with it disabled and did not experience any problems; I suspect it was written to work around a bug that no longer exists. 2015-11-13 Rich Felker <dal...@libc.org> gcc/ * config/sh/sh.md (symGOT_load): Suppress __stack_chk_guard address loading hack for FDPIC targets. diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 7a40d0f..45c9995 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -11082,7 +11082,7 @@ (define_expand "symGOT_load" operands[2] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode); operands[3] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode); - if (!TARGET_SHMEDIA + if (!TARGET_SHMEDIA && !TARGET_FDPIC && flag_stack_protect && GET_CODE (operands[1]) == CONST && GET_CODE (XEXP (operands[1], 0)) == UNSPEC