On Fri, Nov 03, 2023 at 06:51:16PM -0400, Marek Polacek wrote:
> +      if (flag_hardened)
> +     {
> +       if (!fortify_seen_p && optimize > 0)
> +         {
> +           if (TARGET_GLIBC_MAJOR == 2 && TARGET_GLIBC_MINOR >= 35)
> +             cpp_define (parse_in, "_FORTIFY_SOURCE=3");
> +           else
> +             cpp_define (parse_in, "_FORTIFY_SOURCE=2");
> +         }

I don't like the above in generic code, the fact that gcc was configured
against glibc target headers doesn't mean it is targetting glibc.
E.g. for most *-linux* targets, config/linux.opt provides the
-mbionic/-mglibc/-muclibc/-mmusl options.

One ugly way around would be to do
#ifdef OPTION_GLIBC
  if (OPTION_GLIBC && TARGET_GLIBC_MAJOR == 2 && TARGET_GLIBC_MINOR >= 35)
    cpp_define (parse_in, "_FORTIFY_SOURCE=3");
  else
#endif
    cpp_define (parse_in, "_FORTIFY_SOURCE=2");
(assuming OPTION_GLIBC at that point is already computed); a cleaner way
would be to introduce a target hook for that, say
fortify_source_default_level or something similar, where the default hook
would return 2 and next to linux_libc_has_function one would override it
for OPTION_GLIBC && TARGET_GLIBC_MAJOR == 2 && TARGET_GLIBC_MINOR >= 35
to 3.  That way, in the future other targets (say *BSD) can choose to do
something similar more easily.

The rest LGTM.

        Jakub

Reply via email to