* H. J. Lu:

> On Thu, Feb 5, 2026, 6:42 PM Florian Weimer <[email protected]> wrote:

>> Hmm, I'm probably thinking about this the wrong way.  Once the
>> programmer uses -mstack-protector-guard=global, interoperability with
>> the current GNU/Linux toolchain is lost, whether we re-declare
>> __stack_chk_guard or not because glibc does not export that symbol on
>> x86-64 and several other architectures.
>
> Is the macro needed or not?

Would this work out as I expect?

(a) glibc starts exporting __stack_chk_guard@@GLIBC_2.44 (Optional)

(b) We add this to <stdc-predef.h>

#if defined __GNUC__
extern const unsigned long int __stack_chk_guard \
  __attribute__ ((__visibility__ ("hidden")));
#endif

(Maybe for __clang__ as well, to be tested.)

(c) We add a compiled version of

const unsigned long int __stack_chk_guard = <magic goes here>;

to glibc's libc_nonshared.a.

My expectations are:

Without -mstack-protector-guard=global, current GCC will keep using the
guard value from TLS.

With -mstack-protector-guard=global, current GCC ignores the visibility
change.  Depending on how things are linked, we either get a dynamic
reference to __stack_chk_guard@@GLIBC_2.44, or the linker will relax the
relocation against the libc_nonshared.a definition, and we get whatever
libc_nonshared.a produces for its magic ininitialization.
(If there's no __stack_chk_guard@@GLIBC_2.44 symbol, then of course
libc_nonshared.a becomes mandatory.)

With new GCC but without -mstack-protector-guard=global, behavior is as
with old GCC (use TLS).

With new GCC and -mstack-protector-guard=global, GCC honors the change
to hidden visibility, the libc_nonshared.a definition is now required,
and linker relaxation is avoided, leading to better code.

If that's the outcome, I don't think we need the macro after all.

Thanks,
Florian

Reply via email to