* Stefan Schulze Frielinghaus:
> So far only a per thread canary in the TLS block is supported. This
> patch adds support for a global canary, too. For this the new option
> -mstack-protector-guard={global,tls} is added which defaults to tls.
>
> The global canary is expected at symbol __stack_chk_guard which means
> for a function prologue instructions larl/l(g)fr + mvc are emitted and
> for an epilogue larl/l(g)fr + clc.
>
> Furthermore, option -mstack-protector-guard-record is added which is
> inspired by -mrecord-mcount and generates section __stack_protector_loc
> containing pointers to all instructions which load the address of the
> global guard. Thus, this option has only an effect in conjunction with
> -mstack-protector-guard=global. The intended use is for the Linux
> kernel in order to support run-time patching. In each task_struct of
> the kernel a canary is held which will be copied into the lowcore.
> Since the kernel supports migration of the lowcore, addresses are not
> necessarily constant. Therefore, the kernel expects that all
> instructions loading the address of the canary to be of format RIL or
> more precisely are either larl or lgrl and that the instructions
> addresses are recorded in section __stack_protector_loc. The kernel is
> then required to patch those instructions e.g. to llilf, prior first
> execution or whenever the lowcore moves.
>
> In total this means -mstack-protector-guard=global emits code suitable
> for user and kernel space.
>
> gcc/ChangeLog:
>
> * config/s390/s390-opts.h (enum stack_protector_guard): Define
> SP_TLS and SP_GLOBAL.
> * config/s390/s390.h (TARGET_SP_GLOBAL_GUARD): Define predicate.
> (TARGET_SP_TLS_GUARD): Define predicate.
> * config/s390/s390.md (stack_protect_global_guard_addr<mode>):
> New insn.
> (stack_protect_set): Also deal with a global guard.
> (stack_protect_test): Also deal with a global guard.
> * config/s390/s390.opt (-mstack-protector-guard={global,tls}):
> New option.
> (-mstack-protector-guard-record) New option.
Thanks for implementing this.
Does this support changing the visibility of the global guard
variable to hidden?
This would allow us to avoid GOT indirection of the variable if we add
a suitable definition to libc_nonshared.a and a declaration to
<stdc-predef.h>, at least on GNU/Linux.
Related patch from H.J.:
[PATCH v4] c/c++: Make stack protection guard an internal symbol
<https://inbox.sourceware.org/came9roqobmiuwavqkpwbyepfzxctr6mlchtmqwctd+q6ntf...@mail.gmail.com>