Received: by 2002:a25:1104:0:0:0:0:0 with SMTP id 4csp1036796ybr; Sat, 23 May 2020 05:02:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzWI4gpB50zPsMiIGIDPDyZkDSMrv5uOwuEjAykqEGRwKE7Gi4MXjFx75Pi6maMxTeSBZEk X-Received: by 2002:a50:a693:: with SMTP id e19mr6507211edc.275.1590235369578; Sat, 23 May 2020 05:02:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590235369; cv=none; d=google.com; s=arc-20160816; b=E+NsmtNgSuvAMjC89UPgOI2Lx5HQBr/8hLU9Il5j+1S+tz8CzLqqCklbxAnktncqRM 3hvunG2QUeK0aw9rpZtE4zYU/+awbecLXdEgac8uweaK0hF7StAsUOK9OpaqlgujmPOf 4Ge+WBaouuVOQIrTJdEKygTDu27Bac13bdquMLIum4cUetZyVCmiLltE3p6Wj0cTofX0 8XBLaVWuTRJ+4g4Epn10wJYz6J/b/CjfLcHfvp/TGlMdZ5IYlDFQBhMG8Cfvb3GKpj61 EJJ1Ce4nbRJJopk+7e90I7/E3qt2ejGMCfYx3mNfkjNxo3PtxZu24rPwKWVx5hSqZCxW wcgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=/51ekuaVhyK2GAivjmD4UjIiOmiKh+g7A8+spUeYFaQ=; b=sYQt+uKBMaCK56qP62QM2xHp9aEXMxud3gBEDe1e2tG70LCdaaRbbHC/EHxFUObB9+ JjJgE2+Hd5hvpVe8oNGvkY1zti9Qeqan4G7KEgasokvTU/hHE6y/0Shlsmyb6dGmoo5y rO3Rvo+ZLGSQ4p/fA4V92gwB1+EoFtIENSHZJjrX9J8acxpuFliyICMOje8a1QxSfOHG sFUBuNNrOREkefPDRa+3K6ZUy6K1RQ9L3XDNny81Pepc2amqu01IoS/AkDSMisW/GXLS awMayZAA8Ce6VW5iqjVkDy1eXU4z7B6/Xq2Q3qP5aOMkANrvh3m8Ic1HNXn6bMQMnbz9 5oqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2rOBsM8R; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a6si7176629ejy.11.2020.05.23.05.02.26; Sat, 23 May 2020 05:02:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2rOBsM8R; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387809AbgEWMAn (ORCPT + 99 others); Sat, 23 May 2020 08:00:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:40976 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728749AbgEWMAm (ORCPT ); Sat, 23 May 2020 08:00:42 -0400 Received: from localhost.localdomain (82-64-249-211.subs.proxad.net [82.64.249.211]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6F10A2070A; Sat, 23 May 2020 12:00:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590235241; bh=I7jb6C1RNyVBMRZDsHgxpUAsckf/p1J+dg1wIdxLwNM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=2rOBsM8RHaIn7cOcE4a+PyAz0kNYYJZWHbJo+cNmEEmpHXi7YRiJnVmBiuFAO5P2l L5INBQtkgfUgJwvkip7ULW2/A3TBJ/68GXVQdBXcoKD2ZvMvlz8+JKJJNBYZR8id2Z kjdkj7YjtKSPPZOl6nvSsK0l9a1QQrsWdCZL5dNw= From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Ard Biesheuvel , Maarten Lankhorst , Linus Torvalds , Arvind Sankar Subject: [PATCH v2 2/3] x86/boot/compressed: force hidden visibility for all symbol references Date: Sat, 23 May 2020 14:00:20 +0200 Message-Id: <20200523120021.34996-3-ardb@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200523120021.34996-1-ardb@kernel.org> References: <20200523120021.34996-1-ardb@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Eliminate all GOT entries in the decompressor binary, by forcing hidden visibility for all symbol references, which informs the compiler that such references will be resolved at link time without the need for allocating GOT entries. To ensure that no GOT entries will creep back in, add an assertion to the decompressor linker script that will fire if the .got section has a non-zero size. Signed-off-by: Ard Biesheuvel --- arch/x86/boot/compressed/Makefile | 1 + arch/x86/boot/compressed/hidden.h | 19 +++++++++++++++++++ arch/x86/boot/compressed/vmlinux.lds.S | 1 + 3 files changed, 21 insertions(+) diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index 5f7c262bcc99..aa9ed814e5fa 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile @@ -40,6 +40,7 @@ KBUILD_CFLAGS += $(call cc-disable-warning, gnu) KBUILD_CFLAGS += -Wno-pointer-sign KBUILD_CFLAGS += $(call cc-option,-fmacro-prefix-map=$(srctree)/=) KBUILD_CFLAGS += -fno-asynchronous-unwind-tables +KBUILD_CFLAGS += -include hidden.h KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ GCOV_PROFILE := n diff --git a/arch/x86/boot/compressed/hidden.h b/arch/x86/boot/compressed/hidden.h new file mode 100644 index 000000000000..49a17b6b5962 --- /dev/null +++ b/arch/x86/boot/compressed/hidden.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * When building position independent code with GCC using the -fPIC option, + * (or even the -fPIE one on older versions), it will assume that we are + * building a dynamic object (either a shared library or an executable) that + * may have symbol references that can only be resolved at load time. For a + * variety of reasons (ELF symbol preemption, the CoW footprint of the section + * that is modified by the loader), this results in all references to symbols + * with external linkage to go via entries in the Global Offset Table (GOT), + * which carries absolute addresses which need to be fixed up when the + * executable image is loaded at an offset which is different from its link + * time offset. + * + * Fortunately, there is a way to inform the compiler that such symbol + * references will be satisfied at link time rather than at load time, by + * giving them 'hidden' visibility. + */ + +#pragma GCC visibility push(hidden) diff --git a/arch/x86/boot/compressed/vmlinux.lds.S b/arch/x86/boot/compressed/vmlinux.lds.S index ce3fdfb93b57..60a99dfb9d72 100644 --- a/arch/x86/boot/compressed/vmlinux.lds.S +++ b/arch/x86/boot/compressed/vmlinux.lds.S @@ -79,6 +79,7 @@ SECTIONS _end = .; } +ASSERT (SIZEOF(.got) == 0, "Unexpected GOT entries detected!") #ifdef CONFIG_X86_64 ASSERT (SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") -- 2.20.1