On Mon, 13 Jul 2020, Matthias Klose wrote:

> On 6/17/20 3:11 PM, Richard Biener wrote:
> > On Wed, 17 Jun 2020, H.J. Lu wrote:
> > 
> >> On Wed, Jun 17, 2020 at 5:33 AM Richard Biener <rguent...@suse.de> wrote:
> >>>
> >>> On Wed, 17 Jun 2020, H.J. Lu wrote:
> >>>
> >>>> On Wed, Jun 17, 2020 at 5:00 AM Richard Biener <rguent...@suse.de> wrote:
> >>>>>
> >>>>> On Wed, 17 Jun 2020, H.J. Lu wrote:
> >>>>>
> >>>>>> On Wed, Jun 17, 2020 at 1:59 AM Richard Biener
> >>>>>> <richard.guent...@gmail.com> wrote:
> >>>>>>>
> >>>>>>> On Mon, Jun 15, 2020 at 5:30 PM Matthias Klose <d...@ubuntu.com> 
> >>>>>>> wrote:
> >>>>>>>>
> >>>>>>>> PR lto/95604 was seen when checking for binaries without having CET 
> >>>>>>>> support in a
> >>>>>>>> distro archive, for binaries built with LTO optimization.  The 
> >>>>>>>> hardening flag
> >>>>>>>> -fcf-protection=full is passed in CFLAGS, and maybe should be passed 
> >>>>>>>> in LDFLAGS
> >>>>>>>> as well.  However to make it work when not passed to the link step, 
> >>>>>>>> it should be
> >>>>>>>> extracted from the options found in the lto opts section.
> >>>>>>>>
> >>>>>>>> Richard suggested two solutions offline.  I checked that both fix 
> >>>>>>>> the test case.
> >>>>>>>> Which one to install?  Also ok for the 9 and 10 branches?
> >>>>>>>
> >>>>>>> I guess even though variant two is simpler it doesn't make much sense 
> >>>>>>> to
> >>>>>>> have differing settings of -fcf-protection between different 
> >>>>>>> functions?  HJ?
> >>>>>>
> >>>>>> -fcf-protection is applied to a file, not a function since CET marker
> >>>>>> is per file.
> >>>>>>
> >>>>>>> So looking at variant one,
> >>>>>>>
> >>>>>>> @@ -287,6 +287,18 @@
> >>>>>>>                          foption->orig_option_with_args_text);
> >>>>>>>           break;
> >>>>>>>
> >>>>>>> +       case OPT_fcf_protection_:
> >>>>>>> +         /* Append or check identical.  */
> >>>>>>> +         for (j = 0; j < *decoded_options_count; ++j)
> >>>>>>> +           if ((*decoded_options)[j].opt_index == foption->opt_index)
> >>>>>>> +             break;
> >>>>>>> +         if (j == *decoded_options_count)
> >>>>>>> +           append_option (decoded_options, decoded_options_count, 
> >>>>>>> foption);
> >>>>>>> +         else if (strcmp ((*decoded_options)[j].arg, foption->arg))
> >>>>>>> +           warning (input_location, "option %s with different 
> >>>>>>> values",
> >>>>>>> +                    foption->orig_option_with_args_text);
> >>>>>>> +         break;
> >>>>>>>
> >>>>>>> you are always streaming a -fcf-protection option so the if (j ==
> >>>>>>> *decoded_options_count)
> >>>>>>> case shouldn't ever happen but I guess it's safe to leave the code
> >>>>>>> as-is.  Can you
> >>>>>>> amend the warning with the option that prevails?  Maybe
> >>>>>>>
> >>>>>>> +         else if (strcmp ((*decoded_options)[j].arg, foption->arg))
> >>>>>>>            {
> >>>>>>>               static bool noted;
> >>>>>>> +           warning (input_location, "option %s with different 
> >>>>>>> values",
> >>>>>>> +                    foption->orig_option_with_args_text);
> >>>>>>>               if (!noted)
> >>>>>>>                 {
> >>>>>>>                    inform ("%s will be used instead",
> >>>>>>> (*decoded_options)[j].orig_option_with_args_text);
> >>>>>>>                    noted = true;
> >>>>>>>                 }
> >>>>>>>
> >>>>>>> I guess input_location is simply zero so the diagnostic doesn't
> >>>>>>> contain the actual file we're
> >>>>>>> looking at.  Something to improve I guess (also applyign to other
> >>>>>>> diagnostics we emit).
> >>>>>>>
> >>>>>>> Otherwise looks OK.
> >>>>>>>
> >>>>>>> Please wait for HJ in case he'd like to go with option two.
> >>>>>>>
> >>>>>>
> >>>>>> I prefer option one.  But what happens if input files are compiled
> >>>>>> with different -fcf-protection settings?
> >>>>>
> >>>>> You get a warning and the first option setting wins (and I requested
> >>>>> to inform the user which that is).
> >>>>>
> >>>>
> >>>> I think it should be an error and the user should explicitly specify the
> >>>> option with -lfto in the final link command.
> >>>
> >>> But AFAIK ld will not reject linking objects with mismatched settings?
> >>
> >> Linker will silently change CET run-time behavior.
> >>
> >>> Does -fcf-protection have effects "early" (up to IPA)?  That is, is it
> >>> safe to turn it on only post-IPA?
> >>
> >> I think so.  We don't do anything with SHSTK.   For IBT, we just insert an
> >> ENDBR when we output the indirect branch target.
> >>
> >>> So yeah, if the user provided an explicit -fcf-protection option at link
> >>> we honor that (but with the current patch we'd still warn about conflicts
> >>
> >> I don't think we should warn about the explicit -fcf-protection option at 
> >> link
> >> time.
> >>
> >>> between the original TU setting - but not conflicts with the setting
> >>> at link time).  If we want to error on mismatches but allow if at link
> >>> time a setting is specified that needs extra code (it would be the
> >>> first time we have this behavior).
> >>>
> >>
> >> I think we should give an error if there are any mismatches in
> >> inputs and let the explicit -fcf-protection option at link time override
> >> -fcf-protection options in inputs .
> > 
> > Note the linker will then still silently change CET run-time behavior
> > when there's a non-LTO object involved in the link that has
> > mismatched settings.
> > 
> > Matthias - currently find_and_merge_options does not have access
> > to the link-time options, you'd need to pass them down (they are
> > in 'decoded_options', gathered via get_options_from_collect_gcc_options).
> > Note the option overriding simply happens because we append the link-time
> > options to any options coming from the IL file so the only thing you
> > need to do is turn the warning back to an error but guard that with
> > the presence of the option in the link-time options.
> > 
> > Richard.
> 
> here's an updated patch.  checked that it errors out with .o files compiled 
> with
> different -fcf-protection values, and checked that overriding the
> -fcf-protection value at link time works.

+       : global_options.x_flag_cf_protection == CF_RETURN
+       ? "-fcf-protection=RETURN"

typo?  Should be -fcf-protection=return

OK with that fixed.  If you smoke-tested this in the real-world in
Ubuntu with GCC 10 it's also OK for the GCC 10 branch if you are
quick (RC is tomorrow).

Thanks,
Richard.

> Matthias
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to