2023-02-10 20:18:50

by Tom Saeger

[permalink] [raw]
Subject: [PATCH 6.1 v2 0/7] Backport Build ID fixes

Keep 6.1 in-sync with Build ID fixes.

I've build tested this on {x86_64, arm64, riscv, powerpc, s390, sh}.

Changes for v2:
- include 1/7 2348e6bf4421 ("riscv: remove special treatment for the link order of head.o")
- include 2/7 994b7ac1697b ("arm64: remove special treatment for the link order of head.o")
- rebase 7/7 c1c551bebf92 ("sh: define RUNTIME_DISCARD_EXIT") from upstream

Previous threads:
[1] https://lore.kernel.org/all/[email protected]/
[2] https://lore.kernel.org/all/3df32572ec7016e783d37e185f88495831671f5d.1671143628.git.tom.saeger@oracle.com/
[3] https://lore.kernel.org/all/[email protected]/

Signed-off-by: Tom Saeger <[email protected]>
---
Jisheng Zhang (1):
riscv: remove special treatment for the link order of head.o

Masahiro Yamada (3):
arm64: remove special treatment for the link order of head.o
arch: fix broken BuildID for arm64 and riscv
s390: define RUNTIME_DISCARD_EXIT to fix link error with GNU ld < 2.36

Michael Ellerman (2):
powerpc/vmlinux.lds: Define RUNTIME_DISCARD_EXIT
powerpc/vmlinux.lds: Don't discard .rela* for relocatable builds

Tom Saeger (1):
sh: define RUNTIME_DISCARD_EXIT

arch/powerpc/kernel/vmlinux.lds.S | 6 +++++-
arch/s390/kernel/vmlinux.lds.S | 2 ++
arch/sh/kernel/vmlinux.lds.S | 1 +
include/asm-generic/vmlinux.lds.h | 5 +++++
scripts/head-object-list.txt | 2 --
5 files changed, 13 insertions(+), 3 deletions(-)
---
base-commit: d60c95efffe84428e3611431bf688f50bfc13f4e
change-id: 20230210-tsaeger-upstream-linux-6-1-y-06c93fbe5bc8

Best regards,
--
Tom Saeger <[email protected]>



2023-02-10 20:18:56

by Tom Saeger

[permalink] [raw]
Subject: [PATCH 6.1 v2 5/7] powerpc/vmlinux.lds: Don't discard .rela* for relocatable builds

From: Michael Ellerman <[email protected]>

commit 07b050f9290ee012a407a0f64151db902a1520f5 upstream.

Relocatable kernels must not discard relocations, they need to be
processed at runtime. As such they are included for CONFIG_RELOCATABLE
builds in the powerpc linker script (line 340).

However they are also unconditionally discarded later in the
script (line 414). Previously that worked because the earlier inclusion
superseded the discard.

However commit 99cb0d917ffa ("arch: fix broken BuildID for arm64 and
riscv") introduced an earlier use of DISCARD as part of the RO_DATA
macro (line 137). With binutils < 2.36 that causes the DISCARD
directives later in the script to be applied earlier, causing .rela* to
actually be discarded at link time, leading to build warnings and a
kernel that doesn't boot:

ld: warning: discarding dynamic section .rela.init.rodata

Fix it by conditionally discarding .rela* only when CONFIG_RELOCATABLE
is disabled.

Fixes: 99cb0d917ffa ("arch: fix broken BuildID for arm64 and riscv")
Signed-off-by: Michael Ellerman <[email protected]>

Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Tom Saeger <[email protected]>
---
arch/powerpc/kernel/vmlinux.lds.S | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index c5ea7d03d539..a4c6efadc90c 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -411,9 +411,12 @@ SECTIONS
DISCARDS
/DISCARD/ : {
*(*.EMB.apuinfo)
- *(.glink .iplt .plt .rela* .comment)
+ *(.glink .iplt .plt .comment)
*(.gnu.version*)
*(.gnu.attributes)
*(.eh_frame)
+#ifndef CONFIG_RELOCATABLE
+ *(.rela*)
+#endif
}
}

--
2.39.1


2023-02-10 20:19:16

by Tom Saeger

[permalink] [raw]
Subject: [PATCH 6.1 v2 6/7] s390: define RUNTIME_DISCARD_EXIT to fix link error with GNU ld < 2.36

From: Masahiro Yamada <[email protected]>

commit a494398bde273143c2352dd373cad8211f7d94b2 upstream.

Nathan Chancellor reports that the s390 vmlinux fails to link with
GNU ld < 2.36 since commit 99cb0d917ffa ("arch: fix broken BuildID
for arm64 and riscv").

It happens for defconfig, or more specifically for CONFIG_EXPOLINE=y.

$ s390x-linux-gnu-ld --version | head -n1
GNU ld (GNU Binutils for Debian) 2.35.2
$ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- allnoconfig
$ ./scripts/config -e CONFIG_EXPOLINE
$ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- olddefconfig
$ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu-
`.exit.text' referenced in section `.s390_return_reg' of drivers/base/dd.o: defined in discarded section `.exit.text' of drivers/base/dd.o
make[1]: *** [scripts/Makefile.vmlinux:34: vmlinux] Error 1
make: *** [Makefile:1252: vmlinux] Error 2

arch/s390/kernel/vmlinux.lds.S wants to keep EXIT_TEXT:

.exit.text : {
EXIT_TEXT
}

But, at the same time, EXIT_TEXT is thrown away by DISCARD because
s390 does not define RUNTIME_DISCARD_EXIT.

I still do not understand why the latter wins after 99cb0d917ffa,
but defining RUNTIME_DISCARD_EXIT seems correct because the comment
line in arch/s390/kernel/vmlinux.lds.S says:

/*
* .exit.text is discarded at runtime, not link time,
* to deal with references from __bug_table
*/

Nathan also found that binutils commit 21401fc7bf67 ("Duplicate output
sections in scripts") cured this issue, so we cannot reproduce it with
binutils 2.36+, but it is better to not rely on it.

Fixes: 99cb0d917ffa ("arch: fix broken BuildID for arm64 and riscv")
Link: https://lore.kernel.org/all/[email protected]/
Reported-by: Nathan Chancellor <[email protected]>
Signed-off-by: Masahiro Yamada <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Heiko Carstens <[email protected]>
Signed-off-by: Tom Saeger <[email protected]>
---
arch/s390/kernel/vmlinux.lds.S | 2 ++
1 file changed, 2 insertions(+)

diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S
index f81d96710595..cbf9c1b0beda 100644
--- a/arch/s390/kernel/vmlinux.lds.S
+++ b/arch/s390/kernel/vmlinux.lds.S
@@ -17,6 +17,8 @@
/* Handle ro_after_init data on our own. */
#define RO_AFTER_INIT_DATA

+#define RUNTIME_DISCARD_EXIT
+
#define EMITS_PT_NOTE

#include <asm-generic/vmlinux.lds.h>

--
2.39.1


2023-02-10 20:20:00

by Tom Saeger

[permalink] [raw]
Subject: [PATCH 6.1 v2 7/7] sh: define RUNTIME_DISCARD_EXIT

commit c1c551bebf928889e7a8fef7415b44f9a64975f4 upstream.

sh vmlinux fails to link with GNU ld < 2.40 (likely < 2.36) since
commit 99cb0d917ffa ("arch: fix broken BuildID for arm64 and riscv").

This is similar to fixes for powerpc and s390:
commit 4b9880dbf3bd ("powerpc/vmlinux.lds: Define RUNTIME_DISCARD_EXIT").
commit a494398bde27 ("s390: define RUNTIME_DISCARD_EXIT to fix link error
with GNU ld < 2.36").

$ sh4-linux-gnu-ld --version | head -n1
GNU ld (GNU Binutils for Debian) 2.35.2

$ make ARCH=sh CROSS_COMPILE=sh4-linux-gnu- microdev_defconfig
$ make ARCH=sh CROSS_COMPILE=sh4-linux-gnu-

`.exit.text' referenced in section `__bug_table' of crypto/algboss.o:
defined in discarded section `.exit.text' of crypto/algboss.o
`.exit.text' referenced in section `__bug_table' of
drivers/char/hw_random/core.o: defined in discarded section
`.exit.text' of drivers/char/hw_random/core.o
make[2]: *** [scripts/Makefile.vmlinux:34: vmlinux] Error 1
make[1]: *** [Makefile:1252: vmlinux] Error 2

arch/sh/kernel/vmlinux.lds.S keeps EXIT_TEXT:

/*
* .exit.text is discarded at runtime, not link time, to deal with
* references from __bug_table
*/
.exit.text : AT(ADDR(.exit.text)) { EXIT_TEXT }

However, EXIT_TEXT is thrown away by
DISCARD(include/asm-generic/vmlinux.lds.h) because
sh does not define RUNTIME_DISCARD_EXIT.

GNU ld 2.40 does not have this issue and builds fine.
This corresponds with Masahiro's comments in a494398bde27:
"Nathan [Chancellor] also found that binutils
commit 21401fc7bf67 ("Duplicate output sections in scripts") cured this
issue, so we cannot reproduce it with binutils 2.36+, but it is better
to not rely on it."

Link: https://lkml.kernel.org/r/9166a8abdc0f979e50377e61780a4bba1dfa2f52.1674518464.git.tom.saeger@oracle.com
Fixes: 99cb0d917ffa ("arch: fix broken BuildID for arm64 and riscv")
Link: https://lore.kernel.org/all/[email protected]/
Link: https://lore.kernel.org/all/[email protected]/
Signed-off-by: Tom Saeger <[email protected]>
Tested-by: John Paul Adrian Glaubitz <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Dennis Gilmore <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Masahiro Yamada <[email protected]>
Cc: Naresh Kamboju <[email protected]>
Cc: Nathan Chancellor <[email protected]>
Cc: Palmer Dabbelt <[email protected]>
Cc: Rich Felker <[email protected]>
Cc: Yoshinori Sato <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Tom Saeger <[email protected]>
---
arch/sh/kernel/vmlinux.lds.S | 1 +
1 file changed, 1 insertion(+)

diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S
index 3161b9ccd2a5..b6276a3521d7 100644
--- a/arch/sh/kernel/vmlinux.lds.S
+++ b/arch/sh/kernel/vmlinux.lds.S
@@ -4,6 +4,7 @@
* Written by Niibe Yutaka and Paul Mundt
*/
OUTPUT_ARCH(sh)
+#define RUNTIME_DISCARD_EXIT
#include <asm/thread_info.h>
#include <asm/cache.h>
#include <asm/vmlinux.lds.h>

--
2.39.1


2023-02-23 09:54:56

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH 6.1 v2 0/7] Backport Build ID fixes

On Fri, Feb 10, 2023 at 01:17:15PM -0700, Tom Saeger wrote:
> Keep 6.1 in-sync with Build ID fixes.
>
> I've build tested this on {x86_64, arm64, riscv, powerpc, s390, sh}.
>
> Changes for v2:
> - include 1/7 2348e6bf4421 ("riscv: remove special treatment for the link order of head.o")
> - include 2/7 994b7ac1697b ("arm64: remove special treatment for the link order of head.o")
> - rebase 7/7 c1c551bebf92 ("sh: define RUNTIME_DISCARD_EXIT") from upstream
>
> Previous threads:
> [1] https://lore.kernel.org/all/[email protected]/
> [2] https://lore.kernel.org/all/3df32572ec7016e783d37e185f88495831671f5d.1671143628.git.tom.saeger@oracle.com/
> [3] https://lore.kernel.org/all/[email protected]/
>
> Signed-off-by: Tom Saeger <[email protected]>
> ---
> Jisheng Zhang (1):
> riscv: remove special treatment for the link order of head.o
>
> Masahiro Yamada (3):
> arm64: remove special treatment for the link order of head.o
> arch: fix broken BuildID for arm64 and riscv
> s390: define RUNTIME_DISCARD_EXIT to fix link error with GNU ld < 2.36
>
> Michael Ellerman (2):
> powerpc/vmlinux.lds: Define RUNTIME_DISCARD_EXIT
> powerpc/vmlinux.lds: Don't discard .rela* for relocatable builds
>
> Tom Saeger (1):
> sh: define RUNTIME_DISCARD_EXIT
>
> arch/powerpc/kernel/vmlinux.lds.S | 6 +++++-
> arch/s390/kernel/vmlinux.lds.S | 2 ++
> arch/sh/kernel/vmlinux.lds.S | 1 +
> include/asm-generic/vmlinux.lds.h | 5 +++++
> scripts/head-object-list.txt | 2 --
> 5 files changed, 13 insertions(+), 3 deletions(-)
> ---
> base-commit: d60c95efffe84428e3611431bf688f50bfc13f4e
> change-id: 20230210-tsaeger-upstream-linux-6-1-y-06c93fbe5bc8

Now queued up, thanks.

greg k-h