Hi, On some architectures, when given -fstack-protector (which is the default on ubuntu), gcc generates a TLS reference for the stack guard. For instance, on linux x86 with a fairly recent version of glibc: echo 'void f (void) { volatile char a[8]; a[3]; }' | gcc -S -x c -O2 -fstack-protector - -o - generates a %gs:0x14 reference. In freestanding mode, this poses problem because the target (typically an OS kernel) does not necessarily have TLS. In such case, gcc should default back to referencing __stack_chk_guard. Samuel
Created attachment 12622 [details] braindead patch Just a small braindead patch, not tested at all, just adds testing flag_hosted.
Seems to me, you should not be using a target that defines TARGET_THREAD_SSP_OFFSET for -ffreestanding mode. Also IIRC the x86_64 Linux has a different TLS base register which fixes this issue there.
Mmm, if I have to use another target for avoiding my default target's specific stuff, what is the use of -ffreestanding? Does that mean that we will have to add a linux-kernel target (as opposed to linux-user target) and build a cross-compiler before building a linux kernel? (replace "linux" with whatever kernel you want). And x86_64 Linux just poses the same problem: it emits %fs:0x28 instead of %gs:0x14, but it's just the same issue.
Cced to Jakub Jelinek, who originally implemented this functionality. Could you please comment on this issue?
Linux kernel has this support planned: http://lkml.org/lkml/2006/08/16/216 http://lkml.org/lkml/2006/08/16/217 http://lkml.org/lkml/2006/08/16/218 http://lkml.org/lkml/2006/08/16/220 http://lkml.org/lkml/2006/08/16/221 http://lkml.org/lkml/2006/08/16/222 Linux -ffreestanding should stay as is.
So you are saying that gcc now imposes (whatever the kernel) kernel-land and user-land to use the same TLS scheme, and now requires people to build a cross-compiler before building a kernel from another kernel's userland? I thought -ffreestanding was precisely meant to escape such considerations...
Using %fs:0x28/%gs:0x28 on x86_64-linux resp. %gs:0x14 on i?86-linux is part of the ABI. -ffreestanding is not supposed to change the ABI, so if you don't want to use this ABI, just use a different target (x86_64-elf etc., or don't use -fstack-protector (nobody forces you to use that).
If you use __thread in -ffreestanding it is the same, you don't get emulated TLS either.
About not using -fstack-protector, the problem is that it is the default on ubuntu for instance. That would mean we have to explicitely use -fno-stack-protector, but only for recent versions of gcc, so we'll have to detect that, etc... Not counting all such new options that may arise which we'd have to disable... Please answer this, at least by just yes/no: you're saying that -ffreestanding doesn't mean "an OS kernel" (as manual says), but "the kernel of the target", so that people working on other kernels will have to first build a cross-compiler? (the bug is a documentation bug then)
Roland McGrath proposed the following: ``I think it really ought to be controlled by a -mno-stack-protector-tls or suchlike, for complete flexibility. Obviously it should default to disabled for -ffreestanding.''
If changing the code generation or adding a new flag to control this is too difficult, how about just adding this to the list of things that "-Wstack-protector" warns about in the meantime?
See also PR78875.
(In reply to Thomas Schwinge from comment #12) > See also PR78875. That's been closed since you commented.
*** Bug 117149 has been marked as a duplicate of this bug. ***
X86 has options (PR 81708): https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-mstack-protector-guard-reg-3 PPC, aarch64, riscv and arm has options too. while s390 and sparc does not. MIPS and sh does not use TLS for the stack guard variable.
I implemented this for rs6000 in 1b3254e4bbe8. As machine options, since that is the only thing that makes sense. Some other archs have followed suit since then (aarch64, riscv, x86), all slightly differently, and that makes actual sense, so -m was a good choice :-) Closing this PR now, other targets that want this need to do a machine option just as well.
Fixed many years ago.