From patchwork Wed Oct 27 23:34:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 12588985 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B5C6C433F5 for ; Wed, 27 Oct 2021 23:35:49 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2AA7C60EFF for ; Wed, 27 Oct 2021 23:35:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2AA7C60EFF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=5xi+RJzPze8amooTcpmgA3obCyaX+rXuG6Bh4SBNagE=; b=vUmwHq76y7yUy8 Q3zsUYHqAh0kJautdqm4XGF/zfFggthnZ17EvpL04pk89xcq+RmOSwOwdKRJPE48wkzndeCnX8VBP X6camfDFHs0ObH3GgXI/Zu6ipnjKya0/hHj6F1VzuvOcOFEmdDWZgLfdVnCk/SncrX4M1mzD0i1oL mIbm5MfimfE06MGk2AIgOSQ+2VcI/Eh3UYW/Bhwy3ChvX4AHunBJRDgdovh9orbFRK/0G0sGiiupI Rj9lv5OrB4W+nHTry6zXkKkV2kHqHVRCRwQ2TqOcMpQ/0T3KjsSL1OzxOfmSU8PX2F9FhKu7l0CSb Jny2KFWZSe1Go2OfpTBg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mfsRG-006V2e-5i; Wed, 27 Oct 2021 23:34:34 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mfsR3-006Uyn-BB for linux-arm-kernel@lists.infradead.org; Wed, 27 Oct 2021 23:34:22 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id A4B9060EFF; Wed, 27 Oct 2021 23:34:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1635377661; bh=uFIJdCx0wKY/JzDgB9g3KQJU6tBLu+Kzk2JrPUaUpJE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NJlMOvN42SEWsJcuLgSOaEHdrbm+HwSQ8scxgPGOiZvdZEWcGBZEgEMmpoKNfCW07 NLuilrnfl6jWFdDP/Ymt+kykKGrjluFLxTMOFCwojvNw3fTl9F9/V0gR9DMqc8QStl QQo0PrBZgoW9QOH1brNr54kTdpeWZ0zlopjPDUTA4p2yIzmG/Wtlacub/mZTusj96u JESGk2FeUHv+fsJAEi69ut3MCSzyHWGU8NokD+79I2bhRPCoc2DI4eUiiYr5GIWHTX 7TJtNtXj6ZE1HTIHYJ9BQ8AL41cr+XzSD/TGrRfZSQLeWdWm/HEeDsU8ZrJhkWkdvQ XFKW5RWWcJziw== From: Ard Biesheuvel To: linux-arm-kernel@lists.infradead.org Cc: Ard Biesheuvel , Mark Rutland , Quentin Perret , Catalin Marinas , James Morse , Will Deacon , Frederic Weisbecker , Peter Zijlstra , Kees Cook Subject: [PATCH v5 1/2] static_call: force symbol references with external linkage for CFI/LTO Date: Thu, 28 Oct 2021 01:34:08 +0200 Message-Id: <20211027233409.902331-2-ardb@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211027233409.902331-1-ardb@kernel.org> References: <20211027233409.902331-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2061; h=from:subject; bh=uFIJdCx0wKY/JzDgB9g3KQJU6tBLu+Kzk2JrPUaUpJE=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBheeHuVj+DTJacPTYk7Hm3r7h4LN8Ib8QozGFWoMno xmBb5SKJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYXnh7gAKCRDDTyI5ktmPJOs0C/ 42evZtc8RJPmZCTlm241gxognUYBe1fwUO/whjOAykUtSu5hEey1XU4f2gs5dFA6aH0OkTFUUEo3yM WxYojCcStYfO4pVxs22qJDbOYWGDyLF6r9LlfAywWB5DRv0I68VrzhRztz7xnjbOn5aus90bs3Lm08 vXUJK3xFc3v6eoZOK0rqzEHoLWVSCUfOpEglioBUpdFapsU+ZST6Rlxsv/H5pgNDqVxgFzHo2xjBuu UYXoTzCxgQWVNknSEj9aIdR9zrAxmagyHjvc8Jk+FCjMCHm108Q9MWNAzB/GtcqQlFHd9MGbbBXbXC AYo9OLKa+p1QlvaK6LMnBYe4+E6iK4FvEz24o2i6U9cBRInlg05yF0buMA0SgfZwtmFEjDyd+pLMaQ E99Fo+stRSo1sG0+8bR0W1h3rC68Hz2UsANdTVtpErmagqZQEHzYvupJFEPeAxa3HVQscB7r7zzIJ5 di2b8wun8I9JwjaA7rkcEaORvnHnzugIRQQ9Ma9QeWiyY= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211027_163421_476107_CBAB62E8 X-CRM114-Status: GOOD ( 12.52 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When building with Clang with CFI or LTO enabled, the linker may decide not to emit function symbols with static linkage at all, or emit them under a different symbol name. This breaks static calls, given that we refer to such functions both from C code and from assembler, and we expect the names to be the same. So let's force the use of an alias with external linkage in a way that is visible to the compiler. This ensures that the C name and the asm name are identical. Signed-off-by: Ard Biesheuvel --- include/linux/static_call.h | 21 ++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/include/linux/static_call.h b/include/linux/static_call.h index 3e56a9751c06..19dc210214c0 100644 --- a/include/linux/static_call.h +++ b/include/linux/static_call.h @@ -327,10 +327,27 @@ static inline int static_call_text_reserved(void *start, void *end) #endif /* CONFIG_HAVE_STATIC_CALL */ +#ifdef CONFIG_LTO +/* + * DEFINE_STATIC_CALL() accepts any function symbol reference for its _func + * argument, but this may cause problems under Clang LTO/CFI if the function + * symbol has static linkage, because the symbol names exposed at the + * asm/object level may deviate from the C names. So let's force the reference + * to go via an alias with external linkage instead. + */ +#define _DEFINE_STATIC_CALL(name, _func, _init, _alias) \ + extern typeof(_func) _alias __alias(_init); \ + __DEFINE_STATIC_CALL(name, _func, _alias) +#else +#define _DEFINE_STATIC_CALL(name, _func, _init, _alias) \ + __DEFINE_STATIC_CALL(name, _func, _init) +#endif + #define DEFINE_STATIC_CALL(name, _func) \ - __DEFINE_STATIC_CALL(name, _func, _func) + _DEFINE_STATIC_CALL(name, _func, _func, __UNIQUE_ID(_func)) #define DEFINE_STATIC_CALL_RET0(name, _func) \ - __DEFINE_STATIC_CALL(name, _func, __static_call_return0) + _DEFINE_STATIC_CALL(name, _func, __static_call_return0, \ + __UNIQUE_ID(_func)) #endif /* _LINUX_STATIC_CALL_H */