Received: by 10.223.185.116 with SMTP id b49csp2396568wrg; Mon, 12 Feb 2018 08:55:09 -0800 (PST) X-Google-Smtp-Source: AH8x2244R/xC/L+uEv+zA6lXJ7jVZagkP876lHK3HUZqHYYd9tmnRPsbVR/3o/rDZzdSYPyqT/ve X-Received: by 10.99.189.82 with SMTP id d18mr9688029pgp.41.1518454509672; Mon, 12 Feb 2018 08:55:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518454509; cv=none; d=google.com; s=arc-20160816; b=crVK6vAg3ApDWq5YWrXnDUFA4dZCQt3P4e56VwV4XlF1CAyFEWsLlUAxHOSJ2TVvHB 6oV/KmXJY9lZRkRcLpjMD7RqC5mjHABHiDJKVqYcEIvD/cmJmxwYikpHw1YXWMgr3rHP o/khaKwD6Xwfmot0XZ4Y5gnkuDb+ZlE4ZehZELG/bJSYDyBgrR+e+3Se/iNEdPuXeShN Doq7aOMEq2MwnsCz9XeBisBvI+sZf4XjhXiK29wGRGFxCzucOdZlAZIzAxHbFH68Y/AA nSPBat2Hiz6i8L3KQ61gGYpNsZs1LBUgcqLuYWqrp0s/2tYZ+Nil9bHQgPEuze3ep+fb j1kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature:dkim-filter :arc-authentication-results; bh=cjOQpHr0mFKTcQWNFzUgns2b3mzRk285hGhHrg7QtPo=; b=yoncn1UAXkVQBMu9480XQ6//RiMY8vH25+UJRUbq+nBfqzv1JdfO/HFY3Mk7Ne0zMr oOMboix82Z6tKRlP0wn9wv1e9ln//vXGf/Q+Es629PFiigYXVk5g6wJaQ0FGOIVdOc1f ndR+dObihtYRdRzfYS+DptsGRfQjGtAC7NOCKmjGSATB+uYejQ7YnWc/gQOdNUYLsOph YKbMRlC4gjs+sLWW7lyjv6AY+3x4e/b0OvhSURsFrXYodiOulDPCN/HKfMtComvOCvoX GJTxxFlQYZMvNeLbsSktbrgLYROmDlLh45ApeCGcTnYGe4AbNIrHKyAZDxddAK5gLOmt elFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=OAmLuyRx; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e6-v6si70298plt.123.2018.02.12.08.54.55; Mon, 12 Feb 2018 08:55:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=OAmLuyRx; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935993AbeBLOk2 (ORCPT + 99 others); Mon, 12 Feb 2018 09:40:28 -0500 Received: from conssluserg-01.nifty.com ([210.131.2.80]:63512 "EHLO conssluserg-01.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935270AbeBLOk0 (ORCPT ); Mon, 12 Feb 2018 09:40:26 -0500 Received: from mail-ua0-f178.google.com (mail-ua0-f178.google.com [209.85.217.178]) (authenticated) by conssluserg-01.nifty.com with ESMTP id w1CEeBWW012346; Mon, 12 Feb 2018 23:40:11 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-01.nifty.com w1CEeBWW012346 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1518446412; bh=cjOQpHr0mFKTcQWNFzUgns2b3mzRk285hGhHrg7QtPo=; h=In-Reply-To:References:From:Date:Subject:To:Cc:From; b=OAmLuyRxa8incvH+QozO9t3nQAb3tnWEM0xpW1DAq5UIWc2Zx9xBQYYV4+SE2A+7h iPYXbXjIYxr4sxT3NKS/bynKtmrDqqd4GtR0RLz7MYn1twzIEJ5kEB0Civ1+7ACSyJ ACo4MqxFZ5mTMyf/2p5G4sLG0VpPpFEWDKulgNgatKQW8x8y8SxTpZviQIODkeb/kh 1V6usKJLgbCKkAEGqCtPikERsgTX0bbdqL6J5HSlk8piL1mP1HC77tBNJw5uzRJJmz muBvY6nB3fklvAAH520Eq5wduDnoFDP1+cT/bvhJuIQNZ42GXbk1m/zx1l/JNGr1o8 daR1fuSB6xMwQ== X-Nifty-SrcIP: [209.85.217.178] Received: by mail-ua0-f178.google.com with SMTP id p12so9557251uad.0; Mon, 12 Feb 2018 06:40:11 -0800 (PST) X-Gm-Message-State: APf1xPBPvP8iceXBIMREieJ22w/2CV2dOQPJ5PPY9BaT1REmYB1apmvU jVqqbEaUeIMmmMs2zn4fq72saB8Y1LkdCn89Ypc= X-Received: by 10.176.89.9 with SMTP id n9mr11601951uad.195.1518446410354; Mon, 12 Feb 2018 06:40:10 -0800 (PST) MIME-Version: 1.0 Received: by 10.176.83.212 with HTTP; Mon, 12 Feb 2018 06:39:29 -0800 (PST) In-Reply-To: References: <20180210054843.z3g7wvcmlccvww3h@huvuddator> <20180210074924.3nhxsza5zdbaahxx@huvuddator> <20180210080556.mycqsjhxbaguwhay@huvuddator> <20180210085519.737ckf4bcl57h4g2@huvuddator> <20180211103432.pf2ot6nd7nbhdhsy@huvuddator> From: Masahiro Yamada Date: Mon, 12 Feb 2018 23:39:29 +0900 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [RFC PATCH 4/7] kconfig: support new special property shell= To: Kees Cook Cc: Ulf Magnusson , Linus Torvalds , Linux Kbuild mailing list , Greg Kroah-Hartman , Andrew Morton , Nicolas Pitre , "Luis R . Rodriguez" , Randy Dunlap , Sam Ravnborg , Michal Marek , Martin Schwidefsky , Pavel Machek , linux-s390 , Jiri Kosina , Linux Kernel Mailing List , Tejun Heo , Ingo Molnar , "Van De Ven, Arjan" , Arnd Bergmann Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2018-02-12 2:56 GMT+09:00 Kees Cook : > I think it would work to skip KBUILD_CPPFLAGS right up until it > didn't. Since we have the arch split, we can already add -m32 to the > 32-bit case, etc. However, I worry about interaction with other > selected build options. For example, while retpoline doesn't interact > stack-protector, it's easy to imagine things that might. One ugly solution could be to add one more CC_HAS_ for the combination of the two ? # If two compiler flags interact, the combination should be checked. # Hopefully, we do not have many cases like this... config CC_HAS_STACKPROTECTOR_WITH_RETPOLINE option cc_option "-fstackprotector -mindirect-branch=thunk-extern" > (And in thinking about this, does Kconfig know the true $CC in use? > i.e. the configured cross compiler, etc?) I was thinking of removing CONFIG_CROSS_COMPILE. A user can dynamically change CROSS_COMPILE from "make menuconfig". If we continue to support this, $CC changes according to CONFIG_CROSS_COMPILE. Then, compiler flags must be re-evaluated every time a user changes a compiler in use. It will introduce much more complexity. The easiest way would be to import $CC from environment and fix the compiler capability before loading Kconfig. >> - How old do you need to go with GCC for -fno-stack-protector to give an >> error (i.e., for not even the option to be recognized)? Is it still >> warranted to test for it? > > Old? That's not the case. The check for -fno-stack-protector will > likely be needed forever, as some distro compilers enable > stack-protector by default. So when someone wants to explicitly build > without stack-protector (or if the compiler's stack-protector is > detected as broken), we must force it off for the kernel build. > >> Adding some CCs who worked on the stack protector test scripts. >> >> And yeah, I was assuming that needing support scripts would be rare, and that >> you'd usually just check whether gcc accepts the flag. > > That would have been nice, yes. :( > >> When you Google "gcc broken stack protector", the top hits about are about the >> scripts/gcc-x86_64-has-stack-protector.sh script in the kernel throwing a false >> positive by the way (fixed in 82031ea29e45 ("scripts/has-stack-protector: add >> -fno-PIE")). > > That's just the most recent case (from the case where some distro > compilers enabled PIE by default). And was why I was hoping to drop > the scripts entirely. > >> 2. Whether to hide the Kconfig stack protector alternatives or always show them >> >> Or equivalently, whether to automatically fall back on other stack protector >> alternatives (including no stack protector) if the one specified in the .config >> isn't available. >> >> I'll let you battle this one out. In any case, as a user, I'd want a >> super-clear message telling me what to change if the build breaks because of >> missing stack protector support. > > Yes, exactly. > > The reason I built the _AUTO support was to make this easier for > people to not have to think about. I wanted to get rid of explicit > support (i.e. _REGULAR or _STRONG) but some people didn't want _STRONG > (since it has greater code-size impact than _REGULAR), so we've had to > keep that too. > >> 3. Whether to implement CC_STACKPROTECTOR_AUTO in Kconfig or the Makefiles >> >> I'd just go with whatever is simplest here. I don't find the Kconfig version >> too bad, but I'm already very familiar with Kconfig, so it's harder for me to >> tell how it looks to other people. >> >> I'd add some comments to explain the idea in the final version. >> >> @Kees: >> I was assuming that the Makefiles would error out with a message if none of the >> CC_STACKPROTECTOR_* variables are set, in addition to the Kconfig warning. > > That doesn't happy either before nor after _AUTO. The default value > before was _NONE, and the default value after is _AUTO, which will use > whatever is available. > >> You could offload part of that check to Kconfig with something like >> >> config CHOSEN_CC_STACKPROTECTOR_AVAILABLE >> def_bool CC_STACKPROTECTOR_STRONG || \ >> CC_STACKPROTECTOR_REGULAR || \ >> CC_STACKPROTECTOR_NONE >> >> CHOSEN_STACKPROTECTOR_AVAILABLE could then be checked in the Makefile. >> It has the advantage of making the constraint clear in the Kconfig file >> at least. >> >> You could add some kind of assert feature to Kconfig too, but IMO it's not >> warranted purely for one-offs like this at least. > > Agreed; I want to do whatever we can to simplify things. :) > >> That's details though. I'd want to explain it with a comment in any case if we >> go with something like this, since it's slightly kludgy and subtle >> (CC_STACKPROTECTOR_{STRONG,REGULAR,NONE} form a kind of choice, only you can't >> express it like that directly, since it's derived from other symbols). >> >> >> Here's an overview of the current Kconfig layout by the way, assuming >> the old no-fallback behavior and CC_STACKPROTECTOR_AUTO being >> implemented in Kconfig: >> >> # Feature tests >> CC_HAS_STACKPROTECTOR_STRONG >> CC_HAS_STACKPROTECTOR_REGULAR >> CC_HAS_STACKPROTECTOR_NONE > > As long as the feature tests include actual compiler output tests, > yeah, this seems fine. > >> # User request >> WANT_CC_STACKPROTECTOR_AUTO >> WANT_CC_STACKPROTECTOR_STRONG >> WANT_CC_STACKPROTECTOR_REGULAR >> WANT_CC_STACKPROTECTOR_NONE >> >> # The actual "output" to the Makefiles >> CC_STACKPROTECTOR_STRONG >> CC_STACKPROTECTOR_REGULAR >> CC_STACKPROTECTOR_NONE > > This should be fine too (though by this point, I think Kconfig would > already know the specific option, so it could just pass it with a > single output (CC_OPT_STACKPROTECTOR below?) > >> # Some possible output "nicities" >> CHOSEN_CC_STACKPROTECTOR_AVAILABLE >> CC_OPT_STACKPROTECTOR >> >> Does anyone have objections to the naming or other things? I saw some >> references to "Santa's wish list" in messages of commits that dealt with other >> variables named WANT_*, though I didn't look into those cases. ;) > > Another case I mentioned before that I just want to make sure we don't > reintroduce the problem of getting "stuck" with a bad .config file. > While adding _STRONG support, I discovered the two-phase Kconfig > resolution that happens during the build. If you selected _STRONG with > a strong-capable compiler, everything was fine. If you then tried to > build with an older compiler, you'd get stuck since _STRONG wasn't > support (as detected during the first Kconfig phase) so the > generated/autoconf.h would never get updated with the newly selected > _REGULAR). I moved the Makefile analysis of available stack-protector > options into the second phase (i.e. after all the Kconfig runs), and > that worked to both unstick such configs and provide a clear message > early in the build about what wasn't available. > > If all this detection is getting moved up into Kconfig, I'm worried > we'll end up in this state again. If the answer is "you have to delete > autoconf.h if you change compilers", then that's fine, but it sure > seems unfriendly. :) > As Ulf explained, this does not happen. include/config/auto.conf and include/generated/autoconf.h are the mirror of the .config. If .config is updated, silentoldconfig is invoked to sync them. -- Best Regards Masahiro Yamada