2018-06-27 20:42:05

by Greg Hackmann

[permalink] [raw]
Subject: [PATCH] arm64: remove no-op -p linker flag

Linking the ARM64 defconfig kernel with LLVM lld fails with the error:

ld.lld: error: unknown argument: -p
Makefile:1015: recipe for target 'vmlinux' failed

Without this flag, the ARM64 defconfig kernel successfully links with
lld and boots on Dragonboard 410c.

After digging through binutils source and changelogs, it turns out that
-p is only relevant to ancient binutils installations targeting 32-bit
ARM. binutils accepts -p for AArch64 too, but it's always been
undocumented and silently ignored. A comment in
ld/emultempl/aarch64elf.em explains that it's "Only here for backwards
compatibility".

Since this flag is a no-op on ARM64, we can safely drop it.

Signed-off-by: Greg Hackmann <[email protected]>
---
arch/arm64/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 45272266dafb..79bd701071de 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -10,7 +10,7 @@
#
# Copyright (C) 1995-2001 by Russell King

-LDFLAGS_vmlinux :=-p --no-undefined -X
+LDFLAGS_vmlinux :=--no-undefined -X
CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
GZFLAGS :=-9

--
2.18.0.rc2.346.g013aa6912e-goog



2018-06-28 09:41:29

by Will Deacon

[permalink] [raw]
Subject: Re: [PATCH] arm64: remove no-op -p linker flag

On Wed, Jun 27, 2018 at 12:46:14PM -0700, Greg Hackmann wrote:
> Linking the ARM64 defconfig kernel with LLVM lld fails with the error:
>
> ld.lld: error: unknown argument: -p
> Makefile:1015: recipe for target 'vmlinux' failed
>
> Without this flag, the ARM64 defconfig kernel successfully links with
> lld and boots on Dragonboard 410c.
>
> After digging through binutils source and changelogs, it turns out that
> -p is only relevant to ancient binutils installations targeting 32-bit
> ARM. binutils accepts -p for AArch64 too, but it's always been
> undocumented and silently ignored. A comment in
> ld/emultempl/aarch64elf.em explains that it's "Only here for backwards
> compatibility".
>
> Since this flag is a no-op on ARM64, we can safely drop it.

Makes sense:

Acked-by: Will Deacon <[email protected]>

Will

2018-06-28 15:52:30

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH] arm64: remove no-op -p linker flag

On Thu, Jun 28, 2018 at 5:38 AM Will Deacon <[email protected]> wrote:
>
> On Wed, Jun 27, 2018 at 12:46:14PM -0700, Greg Hackmann wrote:
> > Linking the ARM64 defconfig kernel with LLVM lld fails with the error:
> >
> > ld.lld: error: unknown argument: -p
> > Makefile:1015: recipe for target 'vmlinux' failed
> >
> > Without this flag, the ARM64 defconfig kernel successfully links with
> > lld and boots on Dragonboard 410c.

Ha! Just one single unknown linker flag, to link and boot? That's not too bad.

> > After digging through binutils source and changelogs, it turns out that
> > -p is only relevant to ancient binutils installations targeting 32-bit
> > ARM. binutils accepts -p for AArch64 too, but it's always been
> > undocumented and silently ignored.

Nothing in the man pages for ld in regards to -p. Seems like it was
shortform for "--no-pipeline-knowledge: Stop the linker knowing about
the pipeline length".

Looks like it was added to binutils via this commit in 1999:
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=7ca69e9e10ef290eb3dd62a1e6bebbe4c87fa202

And removed in 2004:
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=dea514f51da1051f9f3cd7a746e3b68085aa1a72

arch/arm/Makefile has -p as a LD_FLAGS. Is it actually needed there
too, or can it be removed from there? I assume we'll want to use lld
for arm32 at some point.

> > A comment in
> > ld/emultempl/aarch64elf.em explains that it's "Only here for backwards
> > compatibility".

Yep: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=ld/emultempl/aarch64elf.em;h=edc548f65298e563481bdd9d547fcb9c6b13da04;hb=HEAD#l405

armelf.em also has that comment.

Looks like -p has been in arch/arm64/Makefile since the initial commit
that added that file. So likely copy+pasted from arch/arm/Makefile.

commit 8c2c3df31e3b ("arm64: Build infrastructure"):
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/arch/arm64/Makefile?id=8c2c3df31e3b87cb5348e48776c366ebd1dc5a7a

And it looks like arch/arm/Makefile has has -p since the move to git
for Linux 2.6:

commit 1da177e4c3f4 ("Linux-2.6.12-rc2")
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/arch/arm/Makefile?id=1da177e4c3f41524e886b7f1b8a0c1fc7321cac2

So nothing in the kernel commit history to hint at what it was ever used for.

As long as you have a version of binutils that not 14 years old, you
should be good.

Reviewed-by: Nick Desaulniers <[email protected]>

--
Thanks,
~Nick Desaulniers