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
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
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