From patchwork Fri Jul 31 23:07:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 11695581 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 49FEB161F for ; Fri, 31 Jul 2020 23:12:46 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 B13DF205CB for ; Fri, 31 Jul 2020 23:12:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="XgszRfAA"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="NzZUDe7i" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B13DF205CB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=3biO1odQPsob41DVahDVdrmtowX+NBsY+7DYfDqHK2U=; b=XgszRfAAClWM1CBLPWc30x+V4w 4vLW+085/KdP6ZI2zyg5nGDw0v1lUnmpP8pMpa5jvU7MfozPptNpSB5ZMX1tH/qQYc+um8vxSjmoe ciX/IWoGQIKuxGEfWw/7YBNb62P/H3N2WXFaR7K+k0bYumTr4ShAx5j819rzvzSY/W4zoLmA+93GF 2ZStkoh0yNZ0QXmld3cLsn0Lb2rPrSJXcr7mTESulgN01l/6v7d2fyClZV2K8z3ZlxqO/re6A+rLj aDPD45FHiuswvqSpZ51l08EZ09Nu2ri/oLUnPtKwTDcNVU24ryWEfY6m/yDo9cp2mgQBCPSd0zPiS qkymiPdw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k1e9A-0008IK-6d; Fri, 31 Jul 2020 23:09:04 +0000 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k1e8i-000836-6N for linux-arm-kernel@lists.infradead.org; Fri, 31 Jul 2020 23:08:42 +0000 Received: by mail-pl1-x643.google.com with SMTP id t10so12767814plz.10 for ; Fri, 31 Jul 2020 16:08:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=gOuHhkP4k6lGlo9NwRnrjymhpQ+iLTcLVy67EHO0tLQ=; b=NzZUDe7iAm67VQMOKpyD0BT7sJZoGjYuUhmzenDozFom2d1F/HRnlG/ZBJY5eawEvc E0n37aArltq+4l4myD951tS6uvqRjvAXeMfP7eCStHMi5YUZaE/adhsWqgj43zn0ixh9 LahBtGMifU+Qbp9+BTdqhw8Sr92IcNsyJaTqo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=gOuHhkP4k6lGlo9NwRnrjymhpQ+iLTcLVy67EHO0tLQ=; b=PSaKQ5gK32rCZHw5428IgHOmMg3kDzmOIJ52uulgQAcjAnTNH9IvHzhVwLSDoxWL37 ebEa8Y/HSFK5F8ONbZ1yqYsTOR4I5dZFRIEkYrNwJp8k9dsunvjz3P8YNR85EVuc0Nd8 EW2uyZGk+Bo2FgmWiBlZhg8golIfopQv+/XoTFDbmzRUmrk9rIxlOaN35kLhKnJvQfOv GNCZxW/g1bbKAfG9NFkn41SiRgoZjJtZarkt4tNfefC3tvDJbzrwpihNO/eXmXkiLhjv Yab8E6+znHNSbkF3JF7SGEn6L3tkFvXkFvteUgqmLQSa+f9gjVUOUWcLRgersrXRvsws 0xfg== X-Gm-Message-State: AOAM532nlpjqtiQMcbkD3zxXw0Ko13APjEIGfW4dsc+qJ1Z8q8SCjNV5 mB3pqu657MqC2EobOKFhSUR/Dg== X-Google-Smtp-Source: ABdhPJz3fXyytD9EO07YlzPodHLiEZDHHyttLv6MM7s5IQHc8USlFwFYwYDbELejqRupf7YkNtJmug== X-Received: by 2002:a17:90a:db53:: with SMTP id u19mr6145819pjx.13.1596236913938; Fri, 31 Jul 2020 16:08:33 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id b22sm9843691pju.26.2020.07.31.16.08.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 16:08:30 -0700 (PDT) From: Kees Cook To: Thomas Gleixner , Will Deacon Subject: [PATCH v5 00/36] Warn on orphan section placement Date: Fri, 31 Jul 2020 16:07:44 -0700 Message-Id: <20200731230820.1742553-1-keescook@chromium.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200731_190836_311809_BB854968 X-CRM114-Status: GOOD ( 20.26 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:643 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.0 DKIMWL_WL_HIGH DKIMwl.org - Whitelisted High sender X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, Kees Cook , Arnd Bergmann , Catalin Marinas , Masahiro Yamada , x86@kernel.org, Nick Desaulniers , Russell King , linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com, Arvind Sankar , Ingo Molnar , James Morse , Nathan Chancellor , Borislav Petkov , Peter Collingbourne , Ard Biesheuvel , linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/log/?h=linker/orphans/warn/v5 v5: - rebase from -rc2 to -rc7 to avoid build failures on Clang vs binutils - include Arvind's GOT fix-up series[3], since it touches many similar areas - add PGO/AutoFDO section patch[4] - split up x86 and arm changes into more digestable steps - move several sections out of DISCARD and into zero-size asserts - introduce COMMON_DISCARDS to improve ARM's linker scripts v4: https://lore.kernel.org/lkml/20200629061840.4065483-1-keescook@chromium.org/ v3: https://lore.kernel.org/lkml/20200624014940.1204448-1-keescook@chromium.org/ v2: https://lore.kernel.org/lkml/20200622205815.2988115-1-keescook@chromium.org/ v1: https://lore.kernel.org/lkml/20200228002244.15240-1-keescook@chromium.org/ A recent bug[1] was solved for builds linked with ld.lld, and tracking it down took way longer than it needed to (a year). Ultimately, it boiled down to differences between ld.bfd and ld.lld's handling of orphan sections. Similar situation have continued to recur, and it's clear the kernel build needs to be much more explicit about linker sections. Similarly, the recent FGKASLR series brought up orphan section handling too[2]. In all cases, it would have been nice if the linker was running with --orphan-handling=warn so that surprise sections wouldn't silently get mapped into the kernel image at locations up to the whim of the linker's orphan handling logic. Instead, all desired sections should be explicitly identified in the linker script (to be either kept, discarded, or verified to be zero-sized) with any orphans throwing a warning. The powerpc architecture has actually been doing this for some time, so this series just extends that coverage to x86, arm, and arm64. This has gotten sucecssful build testing under the following matrix: compiler/linker: gcc+ld.bfd, clang+ld.lld targets: defconfig, allmodconfig architectures: x86, i386, arm64, arm versions: v5.8-rc7, next-20200731 (with various build fixes[7][8]) Two known-failure exceptions (unchanged by this series) being: - clang+arm/arm64 needs CONFIG_CPU_BIG_ENDIAN=n to pass allmodconfig[5] - clang+i386 only builds in -next, which was recently fixed[6] All three architectures depend on the first several commits to vmlinux.lds.h. x86 depends on Arvind's GOT series[3], so I collected it into this version of my series, as it hadn't been taken into -tip yet. arm64 depends on the efi/libstub patch. As such, I'd like to land this series as a whole. Given that two thirds of it is in the arm universe, perhaps this can land via the arm64 tree? If x86 -tip is preferred, that works too. If I don't hear otherwise, I will just carry this myself in -next. In all cases, I would really appreciate reviews/acks/etc. :) Thanks! -Kees [1] https://github.com/ClangBuiltLinux/linux/issues/282 [2] https://lore.kernel.org/lkml/202002242122.AA4D1B8@keescook/ [3] https://lore.kernel.org/lkml/20200715004133.1430068-1-nivedita@alum.mit.edu/ [4] https://lore.kernel.org/lkml/20200625184752.73095-1-ndesaulniers@google.com/ [5] https://github.com/ClangBuiltLinux/linux/issues/1071 [6] https://github.com/ClangBuiltLinux/linux/issues/194 [7] https://lore.kernel.org/lkml/1596166744-2954-2-git-send-email-neal.liu@mediatek.com/ [8] https://lore.kernel.org/lkml/82f750c4-d423-1ed8-a158-e75153745e07@huawei.com/ Ard Biesheuvel (3): x86/boot/compressed: Move .got.plt entries out of the .got section x86/boot/compressed: Force hidden visibility for all symbol references x86/boot/compressed: Get rid of GOT fixup code Arvind Sankar (4): x86/boot: Add .text.* to setup.ld x86/boot: Remove run-time relocations from .head.text code x86/boot: Remove run-time relocations from head_{32,64}.S x86/boot: Check that there are no run-time relocations Kees Cook (28): vmlinux.lds.h: Create COMMON_DISCARDS vmlinux.lds.h: Add .gnu.version* to COMMON_DISCARDS vmlinux.lds.h: Avoid KASAN and KCSAN's unwanted sections vmlinux.lds.h: Split ELF_DETAILS from STABS_DEBUG vmlinux.lds.h: Add .symtab, .strtab, and .shstrtab to ELF_DETAILS efi/libstub: Disable -mbranch-protection arm64/mm: Remove needless section quotes arm64/kernel: Remove needless Call Frame Information annotations arm64/build: Remove .eh_frame* sections due to unwind tables arm64/build: Use common DISCARDS in linker script arm64/build: Add missing DWARF sections arm64/build: Assert for unwanted sections arm64/build: Warn on orphan section placement arm/build: Refactor linker script headers arm/build: Explicitly keep .ARM.attributes sections arm/build: Add missing sections arm/build: Warn on orphan section placement arm/boot: Handle all sections explicitly arm/boot: Warn on orphan section placement x86/asm: Avoid generating unused kprobe sections x86/build: Enforce an empty .got.plt section x86/build: Assert for unwanted sections x86/build: Warn on orphan section placement x86/boot/compressed: Reorganize zero-size section asserts x86/boot/compressed: Remove, discard, or assert for unwanted sections x86/boot/compressed: Add missing debugging sections to output x86/boot/compressed: Warn on orphan section placement arm/build: Assert for unwanted sections Nick Desaulniers (1): vmlinux.lds.h: add PGO and AutoFDO input sections arch/alpha/kernel/vmlinux.lds.S | 1 + arch/arc/kernel/vmlinux.lds.S | 1 + arch/arm/Makefile | 4 + arch/arm/boot/compressed/Makefile | 2 + arch/arm/boot/compressed/vmlinux.lds.S | 20 +-- .../arm/{kernel => include/asm}/vmlinux.lds.h | 29 ++- arch/arm/kernel/vmlinux-xip.lds.S | 8 +- arch/arm/kernel/vmlinux.lds.S | 8 +- arch/arm64/Makefile | 9 +- arch/arm64/kernel/smccc-call.S | 2 - arch/arm64/kernel/vmlinux.lds.S | 28 ++- arch/arm64/mm/mmu.c | 2 +- arch/csky/kernel/vmlinux.lds.S | 1 + arch/hexagon/kernel/vmlinux.lds.S | 1 + arch/ia64/kernel/vmlinux.lds.S | 1 + arch/mips/kernel/vmlinux.lds.S | 1 + arch/nds32/kernel/vmlinux.lds.S | 1 + arch/nios2/kernel/vmlinux.lds.S | 1 + arch/openrisc/kernel/vmlinux.lds.S | 1 + arch/parisc/boot/compressed/vmlinux.lds.S | 1 + arch/parisc/kernel/vmlinux.lds.S | 1 + arch/powerpc/kernel/vmlinux.lds.S | 2 +- arch/riscv/kernel/vmlinux.lds.S | 1 + arch/s390/kernel/vmlinux.lds.S | 1 + arch/sh/kernel/vmlinux.lds.S | 1 + arch/sparc/kernel/vmlinux.lds.S | 1 + arch/um/kernel/dyn.lds.S | 2 +- arch/um/kernel/uml.lds.S | 2 +- arch/unicore32/kernel/vmlinux.lds.S | 1 + arch/x86/Makefile | 4 + arch/x86/boot/compressed/Makefile | 41 +---- arch/x86/boot/compressed/head_32.S | 99 ++++------- arch/x86/boot/compressed/head_64.S | 165 +++++++----------- arch/x86/boot/compressed/mkpiggy.c | 6 + arch/x86/boot/compressed/vmlinux.lds.S | 48 ++++- arch/x86/boot/setup.ld | 2 +- arch/x86/include/asm/asm.h | 6 +- arch/x86/kernel/vmlinux.lds.S | 39 ++++- drivers/firmware/efi/libstub/Makefile | 11 +- drivers/firmware/efi/libstub/hidden.h | 6 - include/asm-generic/vmlinux.lds.h | 49 +++++- include/linux/hidden.h | 19 ++ 42 files changed, 377 insertions(+), 252 deletions(-) rename arch/arm/{kernel => include/asm}/vmlinux.lds.h (84%) delete mode 100644 drivers/firmware/efi/libstub/hidden.h create mode 100644 include/linux/hidden.h