From patchwork Sat Jan 18 16:57:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 206616 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C21AC33CB1 for ; Sat, 18 Jan 2020 16:57:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E2864246A5 for ; Sat, 18 Jan 2020 16:57:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579366659; bh=4PAmXQWXyYLpA7XxN42bu+/WuorRm2NHzkeiTXHfDmE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=f6uOIN+Jlg+DKFQr8DLWioDwaEcjFiCWoSwzVAn61hXBXR8g0WLIl5x2RsbgamKTK KYKL0ODlPL92WbVhm8cFvyncqbDE6rvKngSVPG8j0aVBmGQL+nGTEq421MTrxHFkxr 0UCN2KnWj6L8mlKZX7pISRebi4FqNmK9+G7I8W9Y= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726597AbgARQ5i (ORCPT ); Sat, 18 Jan 2020 11:57:38 -0500 Received: from mail.kernel.org ([198.145.29.99]:52744 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726413AbgARQ5i (ORCPT ); Sat, 18 Jan 2020 11:57:38 -0500 Received: from e123331-lin.home (amontpellier-657-1-18-247.w109-210.abo.wanadoo.fr [109.210.65.247]) (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 C1D572469E; Sat, 18 Jan 2020 16:57:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579366657; bh=4PAmXQWXyYLpA7XxN42bu+/WuorRm2NHzkeiTXHfDmE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HmBaOjBSCHZwA2i7vEOCIvpVwdGwOJDw5BjhzdMwCRyS0Z5L+B/eeE2Sb7okcEHqe 5LleHE/RXBgzpeQDQwGPA6PMOAK+3bPpLyeNOeFaxAd+Q5NybEC4KOqSgfndOnN145 gWEzYy9fQ7XqOzpaBjI2Tg2dzbRGy3ktDpK4Khss= From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: mingo@kernel.org, x86@kernel.org, Ard Biesheuvel , Nick Desaulniers Subject: [PATCH 2/3] x86/boot/compressed: relax sed symbol type regex for LLVM ld.lld Date: Sat, 18 Jan 2020 17:57:04 +0100 Message-Id: <20200118165705.16544-3-ardb@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200118165705.16544-1-ardb@kernel.org> References: <20200118165705.16544-1-ardb@kernel.org> Sender: linux-efi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org The final build stage of the x86 kernel captures some symbol addresses from the decompressor binary and copies them into zoffset.h. It uses sed with a regular expression that matches the address, symbol type and symbol name, and mangles the captured addresses and the names of symbols of interest into #define directives that are added to zoffset.h The symbol type is indicated by a single letter, which we match strictly: only letters in the set 'ABCDGRSTVW' are matched, even though the actual symbol type is relevant and therefore ignored. Commit bc7c9d620 ("efi/libstub/x86: Force 'hidden' visibility for extern declarations") made a change to the way external symbol references are classified, resulting in 'startup_32' now being emitted as a hidden symbol. This prevents the use of GOT entries to refer to this symbol via its absolute address, which recent toolchains (including Clang based ones) already avoid by default, making this change a no-op in the majority of cases. However, as it turns out, the LLVM linker classifies such hidden symbols as symbols with static linkage in fully linked ELF binaries, causing tools such as NM to output a lowercase 't' rather than an upper case 'T' for the type of such symbols. Since our sed expression only matches upper case letters for the symbol type, the line describing startup_32 is disregarded, resulting in a build error like the following arch/x86/boot/header.S:568:18: error: symbol 'ZO_startup_32' can not be undefined in a subtraction expression init_size: .long (0x00000000008fd000 - ZO_startup_32 + (((0x0000000001f6361c + ((0x0000000001f6361c >> 8) + 65536) - 0x00000000008c32e5) + 4095) & ~4095)) # kernel initialization size Given that we are only interested in the value of the symbol, let's match any character in the set 'a-zA-Z' instead. Tested-by: Nathan Chancellor Cc: Nick Desaulniers Signed-off-by: Ard Biesheuvel --- arch/x86/boot/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile index 95410d6ee2ff..748b6d28a91d 100644 --- a/arch/x86/boot/Makefile +++ b/arch/x86/boot/Makefile @@ -88,7 +88,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' quiet_cmd_zoffset = ZOFFSET $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@