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