[PATCH] x86-64: Compile ISA versions of modf/modff with -fno-stack-protector
H.J. Lu
hjl.tools@gmail.com
Thu Jul 17 14:29:33 GMT 2025
On Thu, Jul 17, 2025 at 6:17 AM Adhemerval Zanella Netto
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 16/07/25 23:48, H.J. Lu wrote:
> > Since modf and modff are compiled into both libc and libm, when glibc is
> > configured with --enable-stack-protector=all, ISA versions of modf and
> > modff should be compiled with -fno-stack-protector to avoid calling
> > __stack_chk_fail via PLT in libc.so.
> >
> > This fixes BZ #33165.
> >
> > Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> > ---
> > sysdeps/x86_64/fpu/multiarch/Makefile | 15 +++++++++++----
> > 1 file changed, 11 insertions(+), 4 deletions(-)
> >
> > diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> > index 5fe872b898..81a870d3b1 100644
> > --- a/sysdeps/x86_64/fpu/multiarch/Makefile
> > +++ b/sysdeps/x86_64/fpu/multiarch/Makefile
> > @@ -159,11 +159,18 @@ CFLAGS-s_sin-avx.c = -msse2avx -DSSE2AVX
> > CFLAGS-s_tan-avx.c = -msse2avx -DSSE2AVX
> > CFLAGS-s_sincos-avx.c = -msse2avx -DSSE2AVX
> >
> > -CFLAGS-s_modf-sse4_1.c = -msse4.1 -fno-builtin-modff32x -fno-builtin-modff64
> > -CFLAGS-s_modff-sse4_1.c = -msse4.1 -fno-builtin-modff32
> > +CFLAGS-s_modf-c.c = $(no-stack-protector)
> > +CFLAGS-s_modff-c.c = $(no-stack-protector)
> >
> > -CFLAGS-s_modf-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32x -fno-builtin-modff64
> > -CFLAGS-s_modff-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32
> > +CFLAGS-s_modf-sse4_1.c = -msse4.1 -fno-builtin-modff32x \
> > + -fno-builtin-modff64 $(no-stack-protector)
> > +CFLAGS-s_modff-sse4_1.c = -msse4.1 -fno-builtin-modff32 \
> > + $(no-stack-protector)
> > +
> > +CFLAGS-s_modf-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32x \
> > + $(no-stack-protector) -fno-builtin-modff64
> > +CFLAGS-s_modff-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32 \
> > + $(no-stack-protector)
> > endif
> >
> > ifeq ($(subdir),mathvec)
>
> I am checking a different strategy to avoid disable stack protector, but I
> don't have a strong preference:
>
> diff --git a/sysdeps/generic/symbol-hacks.h b/sysdeps/generic/symbol-hacks.h
> index 1115e4c0a7..1bd330cc88 100644
> --- a/sysdeps/generic/symbol-hacks.h
> +++ b/sysdeps/generic/symbol-hacks.h
> @@ -1,20 +1,26 @@
> /* Some compiler optimizations may transform loops into memset/memmove
> calls and without proper declaration it may generate PLT calls. */
> -#if !defined __ASSEMBLER__ && IS_IN (libc) && defined SHARED \
> +#if !defined __ASSEMBLER__ \
> + && IS_IN (libc) \
> + && defined SHARED \
> && !defined LIBC_NONSHARED
> asm ("memmove = __GI_memmove");
> asm ("memset = __GI_memset");
> asm ("memcpy = __GI_memcpy");
> +#endif
>
> /* Some targets do not use __stack_chk_fail_local. In libc.so,
> redirect __stack_chk_fail to a hidden reference
> __stack_chk_fail_local, to avoid the PLT reference.
> __stack_chk_fail itself is a global symbol, exported from libc.so,
> - and cannot be made hidden. */
> -
> -# if IS_IN (libc) && defined SHARED \
> - && defined STACK_PROTECTOR_LEVEL && STACK_PROTECTOR_LEVEL > 0
> + and cannot be made hidden.
> + The FORCE_LOCAL_STACK_CHK_FAIL is used for TU that are also included in
> + libc, but built with a different module name. */
> +#if !defined __ASSEMBLER__ \
> + && (IS_IN (libc) || defined FORCE_LOCAL_STACK_CHK_FAIL) \
> + && defined SHARED \
> + && defined STACK_PROTECTOR_LEVEL && STACK_PROTECTOR_LEVEL > 0 \
> + && !defined LIBC_NONSHARED
> asm (".hidden __stack_chk_fail_local\n"
> "__stack_chk_fail = __stack_chk_fail_local");
> -# endif
> #endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> index 5fe872b898..f129289733 100644
> --- a/sysdeps/x86_64/fpu/multiarch/Makefile
> +++ b/sysdeps/x86_64/fpu/multiarch/Makefile
> @@ -159,11 +159,15 @@ CFLAGS-s_sin-avx.c = -msse2avx -DSSE2AVX
> CFLAGS-s_tan-avx.c = -msse2avx -DSSE2AVX
> CFLAGS-s_sincos-avx.c = -msse2avx -DSSE2AVX
>
> -CFLAGS-s_modf-sse4_1.c = -msse4.1 -fno-builtin-modff32x -fno-builtin-modff64
> -CFLAGS-s_modff-sse4_1.c = -msse4.1 -fno-builtin-modff32
>
> -CFLAGS-s_modf-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32x -fno-builtin-modff64
> -CFLAGS-s_modff-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32
> +CFLAGS-s_modf-c.c = -DFORCE_LOCAL_STACK_CHK_FAIL
> +CFLAGS-s_modff-c.c = -DFORCE_LOCAL_STACK_CHK_FAIL
> +
> +CFLAGS-s_modf-sse4_1.c = -msse4.1 -fno-builtin-modff32x -fno-builtin-modff64 -DFORCE_LOCAL_STACK_CHK_FAIL
> +CFLAGS-s_modff-sse4_1.c = -msse4.1 -fno-builtin-modff32 -DFORCE_LOCAL_STACK_CHK_FAIL
> +
> +CFLAGS-s_modf-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32x -fno-builtin-modff64 -DFORCE_LOCAL_STACK_CHK_FAIL
> +CFLAGS-s_modff-avx.c = -msse2avx -DSSE2AVX -fno-builtin-modff32 -DFORCE_LOCAL_STACK_CHK_FAIL
> endif
>
> ifeq ($(subdir),mathvec)
There is a single math/s_modf-sse4_1.os which goes into both libc.so
and libm.so.
In libc,so, __stack_chk_fail_local should be used and in libm.so
__stack_chk_fail
should be used. How will this work?
--
H.J.
More information about the Libc-alpha
mailing list