lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240207-s390-lld-and-orphan-warn-v1-0-8a665b3346ab@kernel.org>
Date: Wed, 07 Feb 2024 17:14:52 -0700
From: Nathan Chancellor <nathan@...nel.org>
To: hca@...ux.ibm.com, gor@...ux.ibm.com, agordeev@...ux.ibm.com
Cc: borntraeger@...ux.ibm.com, svens@...ux.ibm.com, maskray@...gle.com, 
 ndesaulniers@...gle.com, linux-s390@...r.kernel.org, 
 linux-kernel@...r.kernel.org, llvm@...ts.linux.dev, patches@...ts.linux.dev, 
 Nathan Chancellor <nathan@...nel.org>
Subject: [PATCH 00/11] s390: Support linking with ld.lld

Hi all,

This series allows the s390 kernel to be linked with ld.lld (support for
s390 is under review at [1]). This implicitly depends on [2], which was
created and sent before it was realized that this series was necessary.

The first chunk of this series enables support for
CONFIG_LD_ORPHAN_WARN, as it was discovered during testing that the
kernel fails to build with ld.lld due to differences in orphan section
handling, which would have been caught with the linker's orphan section
warnings ahead of the actual build error. There are no warnings when
building ARCH=s390 defconfig and allmodconfig with GCC 6 through 13 or
tip of tree Clang using ld.bfd or ld.lld

The final patch resolves a series of errors due to ld.lld having a
different default for checking for DT_TEXTREL ('-z text') vs ld.bfd,
which defaults to '-z notext' (but this is configurable at build time).

There is one outstanding issue due to something that ld.lld does not
support that the kernel relies on:

  ld.lld: error: drivers/nvme/host/fc.o:(__bug_table): writable SHF_MERGE section is not supported

This was changed in the kernel in commit e21f8baf8d9a ("s390/bug: add
entry size to the __bug_table section"). Is this change truly necessary?
I selectively applied a revert on top of current mainline and I did not
observe any issues with either Clang or GCC.

diff --git a/arch/s390/include/asm/bug.h b/arch/s390/include/asm/bug.h
index aebe1e22c7be..c500d45fb465 100644
--- a/arch/s390/include/asm/bug.h
+++ b/arch/s390/include/asm/bug.h
@@ -14,7 +14,7 @@
 		".section .rodata.str,\"aMS\",@progbits,1\n"	\
 		"1:	.asciz	\""__FILE__"\"\n"		\
 		".previous\n"					\
-		".section __bug_table,\"awM\",@progbits,%2\n"	\
+		".section __bug_table,\"aw\"\n"			\
 		"2:	.long	0b-.\n"				\
 		"	.long	1b-.\n"				\
 		"	.short	%0,%1\n"			\
@@ -30,7 +30,7 @@
 #define __EMIT_BUG(x) do {					\
 	asm_inline volatile(					\
 		"0:	mc	0,0\n"				\
-		".section __bug_table,\"awM\",@progbits,%1\n"	\
+		".section __bug_table,\"aw\"\n"			\
 		"1:	.long	0b-.\n"				\
 		"	.short	%0\n"				\
 		"	.org	1b+%1\n"			\

If it is necessary, is there any way to work around this error? For
testing purposes, disabling CONFIG_BUG is easy enough but that is not
usable in the real world.

To test this series with ld.lld, you'll need to build ld.lld from the
pull request, which is easy to do following LLVM's instructions [3].
Here is a TL;DR version I tested that just builds LLD with minimal noise
during the build.

$ git clone https://github.com/llvm/llvm-project
$ cd llvm-project
$ git fetch https://github.com/llvm/llvm-project pull/75643/head
$ git switch -d FETCH_HEAD
$ cmake \
    -B build \
    -G Ninja \
    -S llvm \
    --log-level=NOTICE \
    -Wno-dev \
    -DCMAKE_BUILD_TYPE=Release \
    -DLLVM_ENABLE_PROJECTS=lld \
    -DLLVM_ENABLE_WARNINGS=OFF \
    -DLLVM_TARGETS_TO_BUILD=SystemZ
$ ninja -C build lld
$ export PATH=$PWD/build/bin:$PATH

Then build the kernel with 'LD=ld.lld' in addition to whatever command
line you use (I tested both Clang and GCC). I can boot an ld.lld linked
kernel built with both compilers in QEMU with this series.

[    1.386970] Linux version 6.8.0-rc3-00043-g05761ede85d6-dirty (nathan@...-fedora.aadp) (s390-linux-gcc (GCC) 13.2.0, ClangBuiltLinux LLD 19.0.0) #1 SMP Wed Feb  7 16:51:12 MST 2024

[    0.871923] Linux version 6.8.0-rc3-00043-g05761ede85d6-dirty (nathan@...-fedora.aadp) (ClangBuiltLinux clang version 19.0.0git (https://github.com/llvm/llvm-project 417075e56aeba5a5b20301c7bfeba9c2a800982b), ClangBuiltLinux LLD 19.0.0) #1 SMP Wed Feb  7 17:01:22 MST 2024

[1]: https://github.com/llvm/llvm-project/pull/75643
[2]: https://lore.kernel.org/r/20240130-s390-vdso-drop-fpic-from-ldflags-v1-1-094ad104fc55@kernel.org/
[3]: https://llvm.org/docs/CMake.html

---
Nathan Chancellor (11):
      s390: boot: Add support for CONFIG_LD_ORPHAN_WARN
      s390: vmlinux.lds.S: Handle '.data.rel' sections explicitly
      s390: vmlinux.lds.S: Explicitly handle '.got' and '.plt' sections
      s390: vmlinux.lds.S: Discard unnecessary sections
      s390/boot: vmlinux.lds.S: Handle '.init.text'
      s390/boot: vmlinux.lds.S: Handle '.rela' sections
      s390/boot: vmlinux.lds.S: Handle DWARF debug sections
      s390/boot: vmlinux.lds.S: Handle ELF required sections
      s390/boot: vmlinux.lds.S: Handle commonly discarded sections
      s390: Select CONFIG_ARCH_WANT_LD_ORPHAN_WARN
      s390: Link vmlinux with '-z notext'

 arch/s390/Kconfig              |  1 +
 arch/s390/Makefile             |  2 +-
 arch/s390/boot/Makefile        |  5 +++--
 arch/s390/boot/vmlinux.lds.S   | 28 ++++++++++++++++++++++++++++
 arch/s390/kernel/vmlinux.lds.S | 28 +++++++++++++++++++++++++++-
 5 files changed, 60 insertions(+), 4 deletions(-)
---
base-commit: 6613476e225e090cc9aad49be7fa504e290dd33d
change-id: 20240207-s390-lld-and-orphan-warn-d0ff4ff657b0

Best regards,
-- 
Nathan Chancellor <nathan@...nel.org>


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ