linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] kbuild: add CONFIG_LD_IS_LLD
@ 2020-04-19 18:04 Nathan Chancellor
  2020-04-19 18:04 ` [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld Nathan Chancellor
  2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
  0 siblings, 2 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 18:04 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

From: Sami Tolvanen <samitolvanen@google.com>

Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
specific logic such as ld-version or ld-ifversion and gain the
ability to select potential features that depend on the linker at
configuration time such as LTO.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
[nc: Reword commit message]
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

Sami, please scream if you are unhappy with how I worded this commit.

 init/Kconfig | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/init/Kconfig b/init/Kconfig
index 9e22ee8fbd75..c15ee42b8272 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -23,6 +23,9 @@ config LD_VERSION
 config CC_IS_CLANG
 	def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
 
+config LD_IS_LLD
+	def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
+
 config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))

base-commit: 50cc09c18985eacbbd666acfd7be2391394733f5
-- 
2.26.1


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld
  2020-04-19 18:04 [PATCH 1/2] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
@ 2020-04-19 18:04 ` Nathan Chancellor
  2020-04-19 18:17   ` Nathan Chancellor
  2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
  1 sibling, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 18:04 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

Currently, when linking with ld.lld, this warning pops up:

    arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25

ld-ifversion calls ld-version, which calls scripts/ld-version.sh, which
is specific to GNU ld. ld.lld has a completely different versioning
scheme (as it follows LLVM's versioning) and it does not have the issue
mentioned in the comment above this block so it should not be subjected
to this check.

With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
vgettimeofday.o.

$ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
			00000024:  R_MIPS_PC32	_start
			000000b0:  R_MIPS_PC32	_start
			000002bc:  R_MIPS_PC32	_start
			0000036c:  R_MIPS_PC32	_start
			00000468:  R_MIPS_PC32	_start

Link: https://github.com/ClangBuiltLinux/linux/issues/785
Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
Reported-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---
 arch/mips/vdso/Makefile | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
index d7fe8408603e..f99e583d14a1 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -65,9 +65,11 @@ DISABLE_VDSO := n
 # the comments on that file.
 #
 ifndef CONFIG_CPU_MIPSR6
-  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
-    $(warning MIPS VDSO requires binutils >= 2.25)
-    DISABLE_VDSO := y
+  ifndef CONFIG_LD_IS_LLD
+    ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
+      $(warning MIPS VDSO requires binutils >= 2.25)
+      DISABLE_VDSO := y
+    endif
   endif
 endif
 
-- 
2.26.1


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld
  2020-04-19 18:04 ` [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld Nathan Chancellor
@ 2020-04-19 18:17   ` Nathan Chancellor
  2020-04-19 19:32     ` Masahiro Yamada
  0 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 18:17 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek

On Sun, Apr 19, 2020 at 11:04:45AM -0700, Nathan Chancellor wrote:
> Currently, when linking with ld.lld, this warning pops up:
> 
>     arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25
> 
> ld-ifversion calls ld-version, which calls scripts/ld-version.sh, which
> is specific to GNU ld. ld.lld has a completely different versioning
> scheme (as it follows LLVM's versioning) and it does not have the issue
> mentioned in the comment above this block so it should not be subjected
> to this check.
> 
> With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
> vgettimeofday.o.
> 
> $ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
> 			00000024:  R_MIPS_PC32	_start
> 			000000b0:  R_MIPS_PC32	_start
> 			000002bc:  R_MIPS_PC32	_start
> 			0000036c:  R_MIPS_PC32	_start
> 			00000468:  R_MIPS_PC32	_start
> 
> Link: https://github.com/ClangBuiltLinux/linux/issues/785
> Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
> Reported-by: Dmitry Golovin <dima@golovin.in>
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> ---
>  arch/mips/vdso/Makefile | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
> index d7fe8408603e..f99e583d14a1 100644
> --- a/arch/mips/vdso/Makefile
> +++ b/arch/mips/vdso/Makefile
> @@ -65,9 +65,11 @@ DISABLE_VDSO := n
>  # the comments on that file.
>  #
>  ifndef CONFIG_CPU_MIPSR6
> -  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
> -    $(warning MIPS VDSO requires binutils >= 2.25)
> -    DISABLE_VDSO := y
> +  ifndef CONFIG_LD_IS_LLD
> +    ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
> +      $(warning MIPS VDSO requires binutils >= 2.25)
> +      DISABLE_VDSO := y
> +    endif
>    endif
>  endif
>  
> -- 
> 2.26.1
> 

Hmmm, I still see this warning when first runing make <config>... I
assume because this Makefile gets parsed before Kconfig runs.

Perhaps it would be better to check if ld-version is 0 (since that means
we are not using GNU ld):

ifneq ($(call ld-ifversion, -eq, 0, y),y)

I am open to suggestions though.

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld
  2020-04-19 18:17   ` Nathan Chancellor
@ 2020-04-19 19:32     ` Masahiro Yamada
  2020-04-19 20:05       ` Nathan Chancellor
  0 siblings, 1 reply; 41+ messages in thread
From: Masahiro Yamada @ 2020-04-19 19:32 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, linux-mips, Linux Kernel Mailing List,
	clang-built-linux, Linux Kbuild mailing list, Nick Desaulniers,
	Sami Tolvanen, Dmitry Golovin, Sedat Dilek

On Mon, Apr 20, 2020 at 3:17 AM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> On Sun, Apr 19, 2020 at 11:04:45AM -0700, Nathan Chancellor wrote:
> > Currently, when linking with ld.lld, this warning pops up:
> >
> >     arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25
> >
> > ld-ifversion calls ld-version, which calls scripts/ld-version.sh, which
> > is specific to GNU ld. ld.lld has a completely different versioning
> > scheme (as it follows LLVM's versioning) and it does not have the issue
> > mentioned in the comment above this block so it should not be subjected
> > to this check.
> >
> > With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
> > vgettimeofday.o.
> >
> > $ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
> >                       00000024:  R_MIPS_PC32  _start
> >                       000000b0:  R_MIPS_PC32  _start
> >                       000002bc:  R_MIPS_PC32  _start
> >                       0000036c:  R_MIPS_PC32  _start
> >                       00000468:  R_MIPS_PC32  _start
> >
> > Link: https://github.com/ClangBuiltLinux/linux/issues/785
> > Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
> > Reported-by: Dmitry Golovin <dima@golovin.in>
> > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> > ---
> >  arch/mips/vdso/Makefile | 8 +++++---
> >  1 file changed, 5 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
> > index d7fe8408603e..f99e583d14a1 100644
> > --- a/arch/mips/vdso/Makefile
> > +++ b/arch/mips/vdso/Makefile
> > @@ -65,9 +65,11 @@ DISABLE_VDSO := n
> >  # the comments on that file.
> >  #
> >  ifndef CONFIG_CPU_MIPSR6
> > -  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
> > -    $(warning MIPS VDSO requires binutils >= 2.25)
> > -    DISABLE_VDSO := y
> > +  ifndef CONFIG_LD_IS_LLD
> > +    ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
> > +      $(warning MIPS VDSO requires binutils >= 2.25)
> > +      DISABLE_VDSO := y
> > +    endif
> >    endif
> >  endif
> >
> > --
> > 2.26.1
> >
>
> Hmmm, I still see this warning when first runing make <config>... I
> assume because this Makefile gets parsed before Kconfig runs.


I do not see the warning for 'make <config>'.

Could you tell me how to reproduce it?


For cleaning, indeed, i see the warning.


$ make ARCH=mips  LLVM=1 clean
arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25








>
> Perhaps it would be better to check if ld-version is 0 (since that means
> we are not using GNU ld):
>
> ifneq ($(call ld-ifversion, -eq, 0, y),y)
>
> I am open to suggestions though.
>
> Cheers,
> Nathan
>
> --
> You received this message because you are subscribed to the Google Groups "Clang Built Linux" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20200419181715.GA36234%40ubuntu-s3-xlarge-x86.



-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld
  2020-04-19 19:32     ` Masahiro Yamada
@ 2020-04-19 20:05       ` Nathan Chancellor
  0 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 20:05 UTC (permalink / raw)
  To: Masahiro Yamada
  Cc: Thomas Bogendoerfer, linux-mips, Linux Kernel Mailing List,
	clang-built-linux, Linux Kbuild mailing list, Nick Desaulniers,
	Sami Tolvanen, Dmitry Golovin, Sedat Dilek

Hi Masahiro,

On Mon, Apr 20, 2020 at 04:32:20AM +0900, Masahiro Yamada wrote:
> On Mon, Apr 20, 2020 at 3:17 AM Nathan Chancellor
> <natechancellor@gmail.com> wrote:
> >
> > On Sun, Apr 19, 2020 at 11:04:45AM -0700, Nathan Chancellor wrote:
> > > Currently, when linking with ld.lld, this warning pops up:
> > >
> > >     arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25
> > >
> > > ld-ifversion calls ld-version, which calls scripts/ld-version.sh, which
> > > is specific to GNU ld. ld.lld has a completely different versioning
> > > scheme (as it follows LLVM's versioning) and it does not have the issue
> > > mentioned in the comment above this block so it should not be subjected
> > > to this check.
> > >
> > > With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
> > > vgettimeofday.o.
> > >
> > > $ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
> > >                       00000024:  R_MIPS_PC32  _start
> > >                       000000b0:  R_MIPS_PC32  _start
> > >                       000002bc:  R_MIPS_PC32  _start
> > >                       0000036c:  R_MIPS_PC32  _start
> > >                       00000468:  R_MIPS_PC32  _start
> > >
> > > Link: https://github.com/ClangBuiltLinux/linux/issues/785
> > > Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
> > > Reported-by: Dmitry Golovin <dima@golovin.in>
> > > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> > > ---
> > >  arch/mips/vdso/Makefile | 8 +++++---
> > >  1 file changed, 5 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
> > > index d7fe8408603e..f99e583d14a1 100644
> > > --- a/arch/mips/vdso/Makefile
> > > +++ b/arch/mips/vdso/Makefile
> > > @@ -65,9 +65,11 @@ DISABLE_VDSO := n
> > >  # the comments on that file.
> > >  #
> > >  ifndef CONFIG_CPU_MIPSR6
> > > -  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
> > > -    $(warning MIPS VDSO requires binutils >= 2.25)
> > > -    DISABLE_VDSO := y
> > > +  ifndef CONFIG_LD_IS_LLD
> > > +    ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
> > > +      $(warning MIPS VDSO requires binutils >= 2.25)
> > > +      DISABLE_VDSO := y
> > > +    endif
> > >    endif
> > >  endif
> > >
> > > --
> > > 2.26.1
> > >
> >
> > Hmmm, I still see this warning when first runing make <config>... I
> > assume because this Makefile gets parsed before Kconfig runs.
> 
> 
> I do not see the warning for 'make <config>'.
> 
> Could you tell me how to reproduce it?
> 
> 
> For cleaning, indeed, i see the warning.
> 
> 
> $ make ARCH=mips  LLVM=1 clean
> arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25

This is enough. I think I figured out how to avoid it, I'll be sending
out v2 shortly, I'd appreciate any comments that you have.

> >
> > Perhaps it would be better to check if ld-version is 0 (since that means
> > we are not using GNU ld):
> >
> > ifneq ($(call ld-ifversion, -eq, 0, y),y)
> >
> > I am open to suggestions though.
> >
> > Cheers,
> > Nathan
> >
> > --
> > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group.
> > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com.
> > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20200419181715.GA36234%40ubuntu-s3-xlarge-x86.
> 
> 
> 
> -- 
> Best Regards
> Masahiro Yamada
> 

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD
  2020-04-19 18:04 [PATCH 1/2] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
  2020-04-19 18:04 ` [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld Nathan Chancellor
@ 2020-04-19 20:21 ` Nathan Chancellor
  2020-04-19 20:21   ` [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
                     ` (3 more replies)
  1 sibling, 4 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 20:21 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

From: Sami Tolvanen <samitolvanen@google.com>

Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
specific logic such as ld-version or ld-ifversion and gain the
ability to select potential features that depend on the linker at
configuration time such as LTO.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
[nc: Reword commit message]
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v1 -> v2:

* No changes.

Sami, please scream if you are unhappy with how I worded this commit.

 init/Kconfig | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/init/Kconfig b/init/Kconfig
index 9e22ee8fbd75..c15ee42b8272 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -23,6 +23,9 @@ config LD_VERSION
 config CC_IS_CLANG
 	def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
 
+config LD_IS_LLD
+	def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
+
 config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))

base-commit: 50cc09c18985eacbbd666acfd7be2391394733f5
-- 
2.26.1


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
  2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
@ 2020-04-19 20:21   ` Nathan Chancellor
  2020-04-20  9:53     ` Sedat Dilek
  2020-04-19 20:21   ` [PATCH v2 3/3] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 20:21 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
have access to GNU ld's version at configuration time. As a result, we
can make it clearer under what configuration circumstances the MIPS VDSO
needs to be disabled.

This is a prerequisite for getting rid of the MIPS VDSO binutils
warning and linking the VDSO when LD is ld.lld. Wrapping the call to
ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
values are wiped away during 'make clean'.

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v1 -> v2:

* New patch.

 arch/mips/Kconfig         |  2 ++
 arch/mips/vdso/Kconfig    | 18 ++++++++++++++++++
 arch/mips/vdso/Makefile   | 30 ++----------------------------
 arch/mips/vdso/vdso.lds.S |  2 +-
 4 files changed, 23 insertions(+), 29 deletions(-)
 create mode 100644 arch/mips/vdso/Kconfig

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 690718b3701a..45220e4b8a65 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -3275,3 +3275,5 @@ endmenu
 source "drivers/firmware/Kconfig"
 
 source "arch/mips/kvm/Kconfig"
+
+source "arch/mips/vdso/Kconfig"
diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
new file mode 100644
index 000000000000..36a52158d849
--- /dev/null
+++ b/arch/mips/vdso/Kconfig
@@ -0,0 +1,18 @@
+# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
+# the base address of VDSO, the linker will emit a R_MIPS_PC32
+# relocation in binutils > 2.25 but it will fail with older versions
+# because that relocation is not supported for that symbol. As a result
+# of which we are forced to disable the VDSO symbols when building
+# with < 2.25 binutils on pre-R6 kernels. For more references on why we
+# can't use other methods to get the base address of VDSO please refer to
+# the comments on that file.
+#
+# GCC (at least up to version 9.2) appears to emit function calls that make use
+# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
+# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
+
+config MIPS_LD_CAN_LINK_VDSO
+	def_bool LD_VERSION >= 225000000
+
+config MIPS_DISABLE_VDSO
+	def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
index d7fe8408603e..92b53d1df42c 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -52,37 +52,11 @@ endif
 
 CFLAGS_REMOVE_vgettimeofday.o = -pg
 
-DISABLE_VDSO := n
-
-#
-# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
-# the base address of VDSO, the linker will emit a R_MIPS_PC32
-# relocation in binutils > 2.25 but it will fail with older versions
-# because that relocation is not supported for that symbol. As a result
-# of which we are forced to disable the VDSO symbols when building
-# with < 2.25 binutils on pre-R6 kernels. For more references on why we
-# can't use other methods to get the base address of VDSO please refer to
-# the comments on that file.
-#
-ifndef CONFIG_CPU_MIPSR6
-  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
+ifdef CONFIG_MIPS_DISABLE_VDSO
+  ifndef CONFIG_MIPS_LD_CAN_LINK_VDSO
     $(warning MIPS VDSO requires binutils >= 2.25)
-    DISABLE_VDSO := y
   endif
-endif
-
-#
-# GCC (at least up to version 9.2) appears to emit function calls that make use
-# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
-# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
-#
-ifdef CONFIG_CPU_MICROMIPS
-  DISABLE_VDSO := y
-endif
-
-ifeq ($(DISABLE_VDSO),y)
   obj-vdso-y := $(filter-out vgettimeofday.o, $(obj-vdso-y))
-  ccflags-vdso += -DDISABLE_MIPS_VDSO
 endif
 
 # VDSO linker flags.
diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
index da4627430aba..ffcb5fc12708 100644
--- a/arch/mips/vdso/vdso.lds.S
+++ b/arch/mips/vdso/vdso.lds.S
@@ -91,7 +91,7 @@ PHDRS
 VERSION
 {
 	LINUX_2.6 {
-#ifndef DISABLE_MIPS_VDSO
+#ifndef CONFIG_DISABLE_MIPS_VDSO
 	global:
 		__vdso_clock_gettime;
 		__vdso_gettimeofday;
-- 
2.26.1


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v2 3/3] MIPS: VDSO: Allow ld.lld to link the VDSO
  2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
  2020-04-19 20:21   ` [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
@ 2020-04-19 20:21   ` Nathan Chancellor
  2020-04-23 14:38   ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Masahiro Yamada
  2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
  3 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-19 20:21 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

Currently, when linking with ld.lld, this warning pops up:

    arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25

CONFIG_LD_VERSION is set with scripts/ld-version.sh, which is specific
to GNU ld. It returns 0 for ld.lld so CONFIG_MIPS_LD_CAN_LINK_VDSO does
not set.

ld.lld has a completely different versioning scheme (as it follows
LLVM's versioning) and it does not have the issue mentioned in the
comment block so it should be allowed to link the VDSO.

With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
vgettimeofday.o.

$ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
			00000024:  R_MIPS_PC32	_start
			000000b0:  R_MIPS_PC32	_start
			000002bc:  R_MIPS_PC32	_start
			0000036c:  R_MIPS_PC32	_start
			00000468:  R_MIPS_PC32	_start

Link: https://github.com/ClangBuiltLinux/linux/issues/785
Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
Reported-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v1 -> v2:

* Move into Kconfig so that the warning does not happen.

 arch/mips/vdso/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
index 36a52158d849..7aec721398d5 100644
--- a/arch/mips/vdso/Kconfig
+++ b/arch/mips/vdso/Kconfig
@@ -12,7 +12,7 @@
 # the lack of relocations. As such, we disable the VDSO for microMIPS builds.
 
 config MIPS_LD_CAN_LINK_VDSO
-	def_bool LD_VERSION >= 225000000
+	def_bool LD_VERSION >= 225000000 || LD_IS_LLD
 
 config MIPS_DISABLE_VDSO
 	def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
-- 
2.26.1


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
  2020-04-19 20:21   ` [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
@ 2020-04-20  9:53     ` Sedat Dilek
  2020-04-21  2:42       ` Nathan Chancellor
  0 siblings, 1 reply; 41+ messages in thread
From: Sedat Dilek @ 2020-04-20  9:53 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	Clang-Built-Linux ML, linux-kbuild, Nick Desaulniers,
	Sami Tolvanen, Dmitry Golovin

On Sun, Apr 19, 2020 at 10:21 PM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
> have access to GNU ld's version at configuration time. As a result, we
> can make it clearer under what configuration circumstances the MIPS VDSO
> needs to be disabled.
>
> This is a prerequisite for getting rid of the MIPS VDSO binutils
> warning and linking the VDSO when LD is ld.lld. Wrapping the call to
> ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
> values are wiped away during 'make clean'.
>
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> ---
>
> v1 -> v2:
>
> * New patch.
>
>  arch/mips/Kconfig         |  2 ++
>  arch/mips/vdso/Kconfig    | 18 ++++++++++++++++++
>  arch/mips/vdso/Makefile   | 30 ++----------------------------
>  arch/mips/vdso/vdso.lds.S |  2 +-
>  4 files changed, 23 insertions(+), 29 deletions(-)
>  create mode 100644 arch/mips/vdso/Kconfig
>
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 690718b3701a..45220e4b8a65 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -3275,3 +3275,5 @@ endmenu
>  source "drivers/firmware/Kconfig"
>
>  source "arch/mips/kvm/Kconfig"
> +
> +source "arch/mips/vdso/Kconfig"
> diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
...
> --- /dev/null
> +++ b/arch/mips/vdso/Kconfig
...
> +config MIPS_DISABLE_VDSO
> +       def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
...
> diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
...
> --- a/arch/mips/vdso/vdso.lds.S
> +++ b/arch/mips/vdso/vdso.lds.S
...
> -#ifndef DISABLE_MIPS_VDSO
> +#ifndef CONFIG_DISABLE_MIPS_VDSO

Should be s/CONFIG_DISABLE_MIPS_VDSO/CONFIG_MIPS_DISABLE_VDSO ?

- Sedat -

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
  2020-04-20  9:53     ` Sedat Dilek
@ 2020-04-21  2:42       ` Nathan Chancellor
  2020-04-23 14:41         ` Masahiro Yamada
  0 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-21  2:42 UTC (permalink / raw)
  To: Sedat Dilek
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	Clang-Built-Linux ML, linux-kbuild, Nick Desaulniers,
	Sami Tolvanen, Dmitry Golovin

On Mon, Apr 20, 2020 at 11:53:55AM +0200, Sedat Dilek wrote:
> On Sun, Apr 19, 2020 at 10:21 PM Nathan Chancellor
> <natechancellor@gmail.com> wrote:
> >
> > After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
> > have access to GNU ld's version at configuration time. As a result, we
> > can make it clearer under what configuration circumstances the MIPS VDSO
> > needs to be disabled.
> >
> > This is a prerequisite for getting rid of the MIPS VDSO binutils
> > warning and linking the VDSO when LD is ld.lld. Wrapping the call to
> > ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
> > values are wiped away during 'make clean'.
> >
> > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> > ---
> >
> > v1 -> v2:
> >
> > * New patch.
> >
> >  arch/mips/Kconfig         |  2 ++
> >  arch/mips/vdso/Kconfig    | 18 ++++++++++++++++++
> >  arch/mips/vdso/Makefile   | 30 ++----------------------------
> >  arch/mips/vdso/vdso.lds.S |  2 +-
> >  4 files changed, 23 insertions(+), 29 deletions(-)
> >  create mode 100644 arch/mips/vdso/Kconfig
> >
> > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> > index 690718b3701a..45220e4b8a65 100644
> > --- a/arch/mips/Kconfig
> > +++ b/arch/mips/Kconfig
> > @@ -3275,3 +3275,5 @@ endmenu
> >  source "drivers/firmware/Kconfig"
> >
> >  source "arch/mips/kvm/Kconfig"
> > +
> > +source "arch/mips/vdso/Kconfig"
> > diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
> ...
> > --- /dev/null
> > +++ b/arch/mips/vdso/Kconfig
> ...
> > +config MIPS_DISABLE_VDSO
> > +       def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
> ...
> > diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
> ...
> > --- a/arch/mips/vdso/vdso.lds.S
> > +++ b/arch/mips/vdso/vdso.lds.S
> ...
> > -#ifndef DISABLE_MIPS_VDSO
> > +#ifndef CONFIG_DISABLE_MIPS_VDSO
> 
> Should be s/CONFIG_DISABLE_MIPS_VDSO/CONFIG_MIPS_DISABLE_VDSO ?
> 
> - Sedat -

Ugh yes, thank you much for pointing it out.

I'll send a v3 once I get further feedback on the series.

Cheers!
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD
  2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
  2020-04-19 20:21   ` [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
  2020-04-19 20:21   ` [PATCH v2 3/3] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
@ 2020-04-23 14:38   ` Masahiro Yamada
  2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
  3 siblings, 0 replies; 41+ messages in thread
From: Masahiro Yamada @ 2020-04-23 14:38 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, linux-mips, Linux Kernel Mailing List,
	clang-built-linux, Linux Kbuild mailing list, Nick Desaulniers,
	Sami Tolvanen, Dmitry Golovin, Sedat Dilek

On Mon, Apr 20, 2020 at 5:21 AM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> From: Sami Tolvanen <samitolvanen@google.com>
>
> Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
> specific logic such as ld-version or ld-ifversion and gain the
> ability to select potential features that depend on the linker at
> configuration time such as LTO.
>
> Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
> [nc: Reword commit message]
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> ---


Acked-by: Masahiro Yamada <masahiroy@kernel.org>


-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
  2020-04-21  2:42       ` Nathan Chancellor
@ 2020-04-23 14:41         ` Masahiro Yamada
  0 siblings, 0 replies; 41+ messages in thread
From: Masahiro Yamada @ 2020-04-23 14:41 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Sedat Dilek, Thomas Bogendoerfer, linux-mips,
	Linux Kernel Mailing List, Clang-Built-Linux ML,
	Linux Kbuild mailing list, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin

On Tue, Apr 21, 2020 at 11:43 AM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> On Mon, Apr 20, 2020 at 11:53:55AM +0200, Sedat Dilek wrote:
> > On Sun, Apr 19, 2020 at 10:21 PM Nathan Chancellor
> > <natechancellor@gmail.com> wrote:
> > >
> > > After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
> > > have access to GNU ld's version at configuration time. As a result, we
> > > can make it clearer under what configuration circumstances the MIPS VDSO
> > > needs to be disabled.
> > >
> > > This is a prerequisite for getting rid of the MIPS VDSO binutils
> > > warning and linking the VDSO when LD is ld.lld. Wrapping the call to
> > > ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
> > > values are wiped away during 'make clean'.
> > >
> > > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> > > ---
> > >
> > > v1 -> v2:
> > >
> > > * New patch.
> > >
> > >  arch/mips/Kconfig         |  2 ++
> > >  arch/mips/vdso/Kconfig    | 18 ++++++++++++++++++
> > >  arch/mips/vdso/Makefile   | 30 ++----------------------------
> > >  arch/mips/vdso/vdso.lds.S |  2 +-
> > >  4 files changed, 23 insertions(+), 29 deletions(-)
> > >  create mode 100644 arch/mips/vdso/Kconfig
> > >
> > > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> > > index 690718b3701a..45220e4b8a65 100644
> > > --- a/arch/mips/Kconfig
> > > +++ b/arch/mips/Kconfig
> > > @@ -3275,3 +3275,5 @@ endmenu
> > >  source "drivers/firmware/Kconfig"
> > >
> > >  source "arch/mips/kvm/Kconfig"
> > > +
> > > +source "arch/mips/vdso/Kconfig"
> > > diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
> > ...
> > > --- /dev/null
> > > +++ b/arch/mips/vdso/Kconfig
> > ...
> > > +config MIPS_DISABLE_VDSO
> > > +       def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
> > ...
> > > diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
> > ...
> > > --- a/arch/mips/vdso/vdso.lds.S
> > > +++ b/arch/mips/vdso/vdso.lds.S
> > ...
> > > -#ifndef DISABLE_MIPS_VDSO
> > > +#ifndef CONFIG_DISABLE_MIPS_VDSO
> >
> > Should be s/CONFIG_DISABLE_MIPS_VDSO/CONFIG_MIPS_DISABLE_VDSO ?
> >
> > - Sedat -
>
> Ugh yes, thank you much for pointing it out.
>
> I'll send a v3 once I get further feedback on the series.


I just wondered if we could raise the minimal binutils
version from 2.23 to 2.25, but it might be too aggressive...
I do not know.

Other than what Sedat pointed out, this looks good me.

-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v3 1/4] kbuild: add CONFIG_LD_IS_LLD
  2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
                     ` (2 preceding siblings ...)
  2020-04-23 14:38   ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Masahiro Yamada
@ 2020-04-23 17:18   ` Nathan Chancellor
  2020-04-23 17:18     ` [PATCH v3 2/4] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
                       ` (3 more replies)
  3 siblings, 4 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-23 17:18 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

From: Sami Tolvanen <samitolvanen@google.com>

Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
specific logic such as ld-version or ld-ifversion and gain the
ability to select potential features that depend on the linker at
configuration time such as LTO.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Acked-by: Masahiro Yamada <masahiroy@kernel.org>
[nc: Reword commit message]
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v2 -> v3:

* Add Masahiro's ack.

v1 -> v2:

* No changes.

Sami, please scream if you are unhappy with how I worded this commit.

 init/Kconfig | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/init/Kconfig b/init/Kconfig
index 9e22ee8fbd75e..c15ee42b82726 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -23,6 +23,9 @@ config LD_VERSION
 config CC_IS_CLANG
 	def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
 
+config LD_IS_LLD
+	def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
+
 config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))

base-commit: ae83d0b416db002fe95601e7f97f64b59514d936
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v3 2/4] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
  2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
@ 2020-04-23 17:18     ` Nathan Chancellor
  2020-04-23 17:18     ` [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
                       ` (2 subsequent siblings)
  3 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-23 17:18 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
have access to GNU ld's version at configuration time. As a result, we
can make it clearer under what configuration circumstances the MIPS VDSO
needs to be disabled.

This is a prerequisite for getting rid of the MIPS VDSO binutils
warning and linking the VDSO when LD is ld.lld. Wrapping the call to
ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
values are wiped away during 'make clean'.

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v2 -> v3:

* Fix CONFIG macro in arch/mips/vdso/vdso.lds.S, thanks to Sedat for
  catching it.

v1 -> v2:

* New patch.

 arch/mips/Kconfig         |  2 ++
 arch/mips/vdso/Kconfig    | 18 ++++++++++++++++++
 arch/mips/vdso/Makefile   | 30 ++----------------------------
 arch/mips/vdso/vdso.lds.S |  2 +-
 4 files changed, 23 insertions(+), 29 deletions(-)
 create mode 100644 arch/mips/vdso/Kconfig

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 690718b3701af..45220e4b8a653 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -3275,3 +3275,5 @@ endmenu
 source "drivers/firmware/Kconfig"
 
 source "arch/mips/kvm/Kconfig"
+
+source "arch/mips/vdso/Kconfig"
diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
new file mode 100644
index 0000000000000..36a52158d849b
--- /dev/null
+++ b/arch/mips/vdso/Kconfig
@@ -0,0 +1,18 @@
+# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
+# the base address of VDSO, the linker will emit a R_MIPS_PC32
+# relocation in binutils > 2.25 but it will fail with older versions
+# because that relocation is not supported for that symbol. As a result
+# of which we are forced to disable the VDSO symbols when building
+# with < 2.25 binutils on pre-R6 kernels. For more references on why we
+# can't use other methods to get the base address of VDSO please refer to
+# the comments on that file.
+#
+# GCC (at least up to version 9.2) appears to emit function calls that make use
+# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
+# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
+
+config MIPS_LD_CAN_LINK_VDSO
+	def_bool LD_VERSION >= 225000000
+
+config MIPS_DISABLE_VDSO
+	def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
index d7fe8408603e8..92b53d1df42c3 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -52,37 +52,11 @@ endif
 
 CFLAGS_REMOVE_vgettimeofday.o = -pg
 
-DISABLE_VDSO := n
-
-#
-# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
-# the base address of VDSO, the linker will emit a R_MIPS_PC32
-# relocation in binutils > 2.25 but it will fail with older versions
-# because that relocation is not supported for that symbol. As a result
-# of which we are forced to disable the VDSO symbols when building
-# with < 2.25 binutils on pre-R6 kernels. For more references on why we
-# can't use other methods to get the base address of VDSO please refer to
-# the comments on that file.
-#
-ifndef CONFIG_CPU_MIPSR6
-  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
+ifdef CONFIG_MIPS_DISABLE_VDSO
+  ifndef CONFIG_MIPS_LD_CAN_LINK_VDSO
     $(warning MIPS VDSO requires binutils >= 2.25)
-    DISABLE_VDSO := y
   endif
-endif
-
-#
-# GCC (at least up to version 9.2) appears to emit function calls that make use
-# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
-# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
-#
-ifdef CONFIG_CPU_MICROMIPS
-  DISABLE_VDSO := y
-endif
-
-ifeq ($(DISABLE_VDSO),y)
   obj-vdso-y := $(filter-out vgettimeofday.o, $(obj-vdso-y))
-  ccflags-vdso += -DDISABLE_MIPS_VDSO
 endif
 
 # VDSO linker flags.
diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
index da4627430aba4..d90b65724d78e 100644
--- a/arch/mips/vdso/vdso.lds.S
+++ b/arch/mips/vdso/vdso.lds.S
@@ -91,7 +91,7 @@ PHDRS
 VERSION
 {
 	LINUX_2.6 {
-#ifndef DISABLE_MIPS_VDSO
+#ifndef CONFIG_MIPS_DISABLE_VDSO
 	global:
 		__vdso_clock_gettime;
 		__vdso_gettimeofday;
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
  2020-04-23 17:18     ` [PATCH v3 2/4] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
@ 2020-04-23 17:18     ` Nathan Chancellor
  2020-04-26 16:27       ` Thomas Bogendoerfer
  2020-04-23 17:18     ` [PATCH v3 4/4] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
  3 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-23 17:18 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

Currently, the VDSO is being linked through $(CC). This does not match
how the rest of the kernel links objects, which is through the $(LD)
variable.

When clang is built in a default configuration, it first attempts to use
the target triple's default linker then the system's default linker,
unless told otherwise through -fuse-ld=... We do not use -fuse-ld=
because it can be brittle and we have support for invoking $(LD)
directly. See commit fe00e50b2db8c ("ARM: 8858/1: vdso: use $(LD)
instead of $(CC) to link VDSO") and commit 691efbedc60d2 ("arm64: vdso:
use $(LD) instead of $(CC) to link VDSO") for examples of doing this in
the VDSO.

Do the same thing here. Replace the custom linking logic with $(cmd_ld)
and ldflags-y so that $(LD) is respected.

Before this patch, LD=ld.lld did nothing:

$ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
String dump of section '.comment':
[     0] ClangBuiltLinux clang version 11.0.0

After this patch, it does:

$ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
String dump of section '.comment':
[     0] Linker: LLD 11.0.0
[    62] ClangBuiltLinux clang version 11.0.0

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v2 -> v3:

* New patch.

 arch/mips/vdso/Makefile | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
index 92b53d1df42c3..da5db947072d5 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -60,10 +60,9 @@ ifdef CONFIG_MIPS_DISABLE_VDSO
 endif
 
 # VDSO linker flags.
-VDSO_LDFLAGS := \
-	-Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1 \
-	$(addprefix -Wl$(comma),$(filter -E%,$(KBUILD_CFLAGS))) \
-	-nostdlib -shared -Wl,--hash-style=sysv -Wl,--build-id
+ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
+	$(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
+	--hash-style=sysv --build-id -T
 
 CFLAGS_REMOVE_vdso.o = -pg
 
@@ -82,11 +81,7 @@ quiet_cmd_vdso_mips_check = VDSOCHK $@
 #
 
 quiet_cmd_vdsold_and_vdso_check = LD      $@
-      cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check); $(cmd_vdso_mips_check)
-
-quiet_cmd_vdsold = VDSO    $@
-      cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
-                   -Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
+      cmd_vdsold_and_vdso_check = $(cmd_ld); $(cmd_vdso_check); $(cmd_vdso_mips_check)
 
 quiet_cmd_vdsoas_o_S = AS      $@
       cmd_vdsoas_o_S = $(CC) $(a_flags) -c -o $@ $<
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v3 4/4] MIPS: VDSO: Allow ld.lld to link the VDSO
  2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
  2020-04-23 17:18     ` [PATCH v3 2/4] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
  2020-04-23 17:18     ` [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
@ 2020-04-23 17:18     ` Nathan Chancellor
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
  3 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-23 17:18 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek,
	Nathan Chancellor

Currently, when linking with ld.lld, this warning pops up:

    arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25

CONFIG_LD_VERSION is set with scripts/ld-version.sh, which is specific
to GNU ld. It returns 0 for ld.lld so CONFIG_MIPS_LD_CAN_LINK_VDSO does
not set.

ld.lld has a completely different versioning scheme (as it follows
LLVM's versioning) and it does not have the issue mentioned in the
comment block so it should be allowed to link the VDSO.

With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
vgettimeofday.o.

$ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
			00000024:  R_MIPS_PC32	_start
			000000b0:  R_MIPS_PC32	_start
			000002bc:  R_MIPS_PC32	_start
			0000036c:  R_MIPS_PC32	_start
			00000468:  R_MIPS_PC32	_start

Reported-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Link: https://github.com/ClangBuiltLinux/linux/issues/785
Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
---

v2 -> v3:

* No changes.

v1 -> v2:

* Move into Kconfig so that the warning does not happen.

 arch/mips/vdso/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
index 36a52158d849b..7aec721398d59 100644
--- a/arch/mips/vdso/Kconfig
+++ b/arch/mips/vdso/Kconfig
@@ -12,7 +12,7 @@
 # the lack of relocations. As such, we disable the VDSO for microMIPS builds.
 
 config MIPS_LD_CAN_LINK_VDSO
-	def_bool LD_VERSION >= 225000000
+	def_bool LD_VERSION >= 225000000 || LD_IS_LLD
 
 config MIPS_DISABLE_VDSO
 	def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-23 17:18     ` [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
@ 2020-04-26 16:27       ` Thomas Bogendoerfer
  2020-04-27  2:08         ` Nathan Chancellor
  2020-04-28  2:17         ` Nathan Chancellor
  0 siblings, 2 replies; 41+ messages in thread
From: Thomas Bogendoerfer @ 2020-04-26 16:27 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Masahiro Yamada, linux-mips, linux-kernel, clang-built-linux,
	linux-kbuild, Nick Desaulniers, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek

On Thu, Apr 23, 2020 at 10:18:06AM -0700, Nathan Chancellor wrote:
> Currently, the VDSO is being linked through $(CC). This does not match
> how the rest of the kernel links objects, which is through the $(LD)
> variable.

this causes build errors for me when (cross) compiling a big endian target:

target is little endian
mips64-linux-gnu-ld: arch/mips/vdso/elf.o: endianness incompatible with that of the selected emulation
mips64-linux-gnu-ld: failed to merge target specific data of file arch/mips/vdso/elf.o

Thomas.

-- 
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea.                                                [ RFC1925, 2.3 ]

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-26 16:27       ` Thomas Bogendoerfer
@ 2020-04-27  2:08         ` Nathan Chancellor
  2020-04-27 16:22           ` Maciej W. Rozycki
  2020-04-28  2:17         ` Nathan Chancellor
  1 sibling, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-27  2:08 UTC (permalink / raw)
  To: Thomas Bogendoerfer
  Cc: Masahiro Yamada, linux-mips, linux-kernel, clang-built-linux,
	linux-kbuild, Nick Desaulniers, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek

On Sun, Apr 26, 2020 at 06:27:37PM +0200, Thomas Bogendoerfer wrote:
> On Thu, Apr 23, 2020 at 10:18:06AM -0700, Nathan Chancellor wrote:
> > Currently, the VDSO is being linked through $(CC). This does not match
> > how the rest of the kernel links objects, which is through the $(LD)
> > variable.
> 
> this causes build errors for me when (cross) compiling a big endian target:
> 
> target is little endian
> mips64-linux-gnu-ld: arch/mips/vdso/elf.o: endianness incompatible with that of the selected emulation
> mips64-linux-gnu-ld: failed to merge target specific data of file arch/mips/vdso/elf.o

Thanks for the report. I will look into it tomorrow and hopefully have a
v4 by then.

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-27  2:08         ` Nathan Chancellor
@ 2020-04-27 16:22           ` Maciej W. Rozycki
  2020-04-27 23:24             ` Nathan Chancellor
  0 siblings, 1 reply; 41+ messages in thread
From: Maciej W. Rozycki @ 2020-04-27 16:22 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Sun, 26 Apr 2020, Nathan Chancellor wrote:

> > this causes build errors for me when (cross) compiling a big endian target:
> > 
> > target is little endian
> > mips64-linux-gnu-ld: arch/mips/vdso/elf.o: endianness incompatible with that of the selected emulation
> > mips64-linux-gnu-ld: failed to merge target specific data of file arch/mips/vdso/elf.o
> 
> Thanks for the report. I will look into it tomorrow and hopefully have a
> v4 by then.

 Can you actually record in the change description what the difference in 
the relevant link command is, as shown where `V=1' has been used with 
`make' invocation?

 Actually running `diff -bu' on the whole `V=1' build log obtained without 
and with your proposed change applied and ensuring there are no unwanted 
changes elsewhere will be a good measure of the correctness of your patch. 
You may have to prepare to be patient and run with `-j1' to make sure any 
`make' parallelism does not interfere with the order of commands printed.

  Maciej



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-27 16:22           ` Maciej W. Rozycki
@ 2020-04-27 23:24             ` Nathan Chancellor
  2020-04-29 17:46               ` Maciej W. Rozycki
  0 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-27 23:24 UTC (permalink / raw)
  To: Maciej W. Rozycki
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Mon, Apr 27, 2020 at 05:22:53PM +0100, Maciej W. Rozycki wrote:
> On Sun, 26 Apr 2020, Nathan Chancellor wrote:
> 
> > > this causes build errors for me when (cross) compiling a big endian target:
> > > 
> > > target is little endian
> > > mips64-linux-gnu-ld: arch/mips/vdso/elf.o: endianness incompatible with that of the selected emulation
> > > mips64-linux-gnu-ld: failed to merge target specific data of file arch/mips/vdso/elf.o
> > 
> > Thanks for the report. I will look into it tomorrow and hopefully have a
> > v4 by then.
> 
>  Can you actually record in the change description what the difference in 
> the relevant link command is, as shown where `V=1' has been used with 
> `make' invocation?

That will be rather unweildy to put in the commit message since
currently, $(CC) + $(KBUILD_CFLAGS) is being used but I can if it is
really desired. Otherwise, I can just put it where I put the changelog.

>  Actually running `diff -bu' on the whole `V=1' build log obtained without 
> and with your proposed change applied and ensuring there are no unwanted 
> changes elsewhere will be a good measure of the correctness of your patch. 
> You may have to prepare to be patient and run with `-j1' to make sure any 
> `make' parallelism does not interfere with the order of commands printed.
> 
>   Maciej
> 

Thanks for the input, I will take a look.

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-26 16:27       ` Thomas Bogendoerfer
  2020-04-27  2:08         ` Nathan Chancellor
@ 2020-04-28  2:17         ` Nathan Chancellor
  1 sibling, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28  2:17 UTC (permalink / raw)
  To: Thomas Bogendoerfer
  Cc: Masahiro Yamada, linux-mips, linux-kernel, clang-built-linux,
	linux-kbuild, Nick Desaulniers, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek

On Sun, Apr 26, 2020 at 06:27:37PM +0200, Thomas Bogendoerfer wrote:
> On Thu, Apr 23, 2020 at 10:18:06AM -0700, Nathan Chancellor wrote:
> > Currently, the VDSO is being linked through $(CC). This does not match
> > how the rest of the kernel links objects, which is through the $(LD)
> > variable.
> 
> this causes build errors for me when (cross) compiling a big endian target:
> 
> target is little endian
> mips64-linux-gnu-ld: arch/mips/vdso/elf.o: endianness incompatible with that of the selected emulation
> mips64-linux-gnu-ld: failed to merge target specific data of file arch/mips/vdso/elf.o
> 
> Thomas.
> 

Thanks for reporting this, I figured it out. This is the solution that I
came up with, I'll send out a v4 tomorrow once I do some more testing.

Cheers,
Nathan

From 256e3b6c8fff7a66aa29961ebefc0fe653ec34b6 Mon Sep 17 00:00:00 2001
From: Nathan Chancellor <natechancellor@gmail.com>
Date: Mon, 27 Apr 2020 17:02:55 -0700
Subject: [PATCH] MIPS: Unconditionally specify '-EL' or '-EB'

This was all done to work around a GCC bug that has been fixed after
4.2. The kernel requires GCC 4.6 or newer so remove all of these hacks
and just use the traditional flags.

 $ mips64-linux-gcc --version | head -n1
 mips64-linux-gcc (GCC) 4.6.3

 $ mips64-linux-gcc -EB -dM -E -C -x c /dev/null | grep MIPSE
 #define MIPSEB 1
 #define __MIPSEB__ 1
 #define _MIPSEB 1
 #define __MIPSEB 1

 $ mips64-linux-gcc -EL -dM -E -C -x c /dev/null | grep MIPSE
 #define __MIPSEL__ 1
 #define MIPSEL 1
 #define _MIPSEL 1
 #define __MIPSEL 1

This is necessary when converting the MIPS VDSO to use $(LD) instead of
$(CC) to link because the OUTPUT_FORMAT is defaulted to little endian
and only flips to big endian when -EB is set on the command line, which
is inherited from KBUILD_CFLAGS. Without this, we will see the following
error when compiling for big endian (64r2_defconfig):

$ make -j$(nproc) ARCH=mips CROSS_COMPILE=mips64-linux- \
  64r2el_defconfig arch/mips/vdso/
...
mips64-linux-ld: arch/mips/vdso/elf.o: compiled for a big endian system
and target is little endian
mips64-linux-ld: arch/mips/vdso/elf.o: endianness incompatible with that
of the selected emulation
mips64-linux-ld: failed to merge target specific data of file
arch/mips/vdso/elf.o
...

Reported-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---
 arch/mips/Makefile | 25 -------------------------
 1 file changed, 25 deletions(-)

diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index e1c44aed81565..301efb90b51ed 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -116,33 +116,8 @@ endif
 
 cflags-y += -ffreestanding
 
-#
-# We explicitly add the endianness specifier if needed, this allows
-# to compile kernels with a toolchain for the other endianness. We
-# carefully avoid to add it redundantly because gcc 3.3/3.4 complains
-# when fed the toolchain default!
-#
-# Certain gcc versions up to gcc 4.1.1 (probably 4.2-subversion as of
-# 2006-10-10 don't properly change the predefined symbols if -EB / -EL
-# are used, so we kludge that here.  A bug has been filed at
-# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29413.
-#
-# clang doesn't suffer from these issues and our checks against -dumpmachine
-# don't work so well when cross compiling, since without providing --target
-# clang's output will be based upon the build machine. So for clang we simply
-# unconditionally specify -EB or -EL as appropriate.
-#
-ifdef CONFIG_CC_IS_CLANG
 cflags-$(CONFIG_CPU_BIG_ENDIAN)		+= -EB
 cflags-$(CONFIG_CPU_LITTLE_ENDIAN)	+= -EL
-else
-undef-all += -UMIPSEB -U_MIPSEB -U__MIPSEB -U__MIPSEB__
-undef-all += -UMIPSEL -U_MIPSEL -U__MIPSEL -U__MIPSEL__
-predef-be += -DMIPSEB -D_MIPSEB -D__MIPSEB -D__MIPSEB__
-predef-le += -DMIPSEL -D_MIPSEL -D__MIPSEL -D__MIPSEL__
-cflags-$(CONFIG_CPU_BIG_ENDIAN)		+= $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB $(undef-all) $(predef-be))
-cflags-$(CONFIG_CPU_LITTLE_ENDIAN)	+= $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL $(undef-all) $(predef-le))
-endif
 
 cflags-$(CONFIG_SB1XXX_CORELIS)	+= $(call cc-option,-mno-sched-prolog) \
 				   -fno-omit-frame-pointer
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO
  2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
                       ` (2 preceding siblings ...)
  2020-04-23 17:18     ` [PATCH v3 4/4] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
@ 2020-04-28 22:14     ` Nathan Chancellor
  2020-04-28 22:14       ` [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
                         ` (6 more replies)
  3 siblings, 7 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28 22:14 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Fangrui Song, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek

Hi all,

This series allows ld.lld to properly and completely link the MIPS vDSO.

Patch 1 adds ld.lld support to Kconfig so that we can avoid certain
ld.bfd checks.

Patch 2 moves disabling of the VDSO to Kconfig. This allows us to avoid
a warning with LD=ld.lld during the clean phase, when we do not have
access to CONFIG_LD_IS_LLD.

Patch 3 prepares for the shift from $(CC) to $(LD) and is probably a
worthwhile change aside from this series because GCC 4.6 is the minimum
version allowed to build the kernel.

Patch 4 does the actual shift from $(CC) to $(LD) to link the VDSO.

Patch 5 allows LD=ld.lld to build the VDSO fully through Kconfig.

I have build tested 32r2_defconfig, 32r2el_defconfig, 64r2_defconfig,
and 64r2el_defconfig with GCC and 32r2el_defconfig and
malta_kvm_guest_defconfig with clang. There is a separate issue with the
64-bit configs (https://github.com/ClangBuiltLinux/linux/issues/884) and
ld.lld does not support the triple OUTPUT_FORMAT linker script macro so
32r2_defconfig errors out in a manner similar to GCC without patch 3:
https://github.com/llvm/llvm-project/blob/46a75436f811d0e6a2c76c669140a7e9471cd2a3/lld/ELF/ScriptParser.cpp#L430
TODO: File an LLVM bug upstream

Please let me know if there are any issues!

Cheers,
Nathan



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
@ 2020-04-28 22:14       ` Nathan Chancellor
  2020-04-29  7:13         ` Sedat Dilek
  2020-04-28 22:14       ` [PATCH v4 2/5] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
                         ` (5 subsequent siblings)
  6 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28 22:14 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Fangrui Song, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek, Nathan Chancellor

From: Sami Tolvanen <samitolvanen@google.com>

Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
specific logic such as ld-version or ld-ifversion and gain the
ability to select potential features that depend on the linker at
configuration time such as LTO.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Acked-by: Masahiro Yamada <masahiroy@kernel.org>
[nc: Reword commit message]
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v3 -> v4:

* No changes.

v2 -> v3:

* Add Masahiro's ack.

v1 -> v2:

* No changes.

Sami, please scream if you are unhappy with how I worded this commit.

 init/Kconfig | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/init/Kconfig b/init/Kconfig
index 9e22ee8fbd75e..c15ee42b82726 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -23,6 +23,9 @@ config LD_VERSION
 config CC_IS_CLANG
 	def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
 
+config LD_IS_LLD
+	def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
+
 config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))

base-commit: 96c9a7802af7d500a582d89a8b864584fe878c1b
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v4 2/5] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
  2020-04-28 22:14       ` [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
@ 2020-04-28 22:14       ` Nathan Chancellor
  2020-04-28 22:14       ` [PATCH v4 3/5] MIPS: Unconditionally specify '-EB' or '-EL' Nathan Chancellor
                         ` (4 subsequent siblings)
  6 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28 22:14 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Fangrui Song, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek, Nathan Chancellor

After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
have access to GNU ld's version at configuration time. As a result, we
can make it clearer under what configuration circumstances the MIPS VDSO
needs to be disabled.

This is a prerequisite for getting rid of the MIPS VDSO binutils
warning and linking the VDSO when LD is ld.lld. Wrapping the call to
ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
values are wiped away during 'make clean'.

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v3 -> v4:

* No changes.

v2 -> v3:

* Fix CONFIG macro in arch/mips/vdso/vdso.lds.S, thanks to Sedat for
  catching it.

v1 -> v2:

* New patch.

 arch/mips/Kconfig         |  2 ++
 arch/mips/vdso/Kconfig    | 18 ++++++++++++++++++
 arch/mips/vdso/Makefile   | 30 ++----------------------------
 arch/mips/vdso/vdso.lds.S |  2 +-
 4 files changed, 23 insertions(+), 29 deletions(-)
 create mode 100644 arch/mips/vdso/Kconfig

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 690718b3701af..45220e4b8a653 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -3275,3 +3275,5 @@ endmenu
 source "drivers/firmware/Kconfig"
 
 source "arch/mips/kvm/Kconfig"
+
+source "arch/mips/vdso/Kconfig"
diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
new file mode 100644
index 0000000000000..36a52158d849b
--- /dev/null
+++ b/arch/mips/vdso/Kconfig
@@ -0,0 +1,18 @@
+# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
+# the base address of VDSO, the linker will emit a R_MIPS_PC32
+# relocation in binutils > 2.25 but it will fail with older versions
+# because that relocation is not supported for that symbol. As a result
+# of which we are forced to disable the VDSO symbols when building
+# with < 2.25 binutils on pre-R6 kernels. For more references on why we
+# can't use other methods to get the base address of VDSO please refer to
+# the comments on that file.
+#
+# GCC (at least up to version 9.2) appears to emit function calls that make use
+# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
+# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
+
+config MIPS_LD_CAN_LINK_VDSO
+	def_bool LD_VERSION >= 225000000
+
+config MIPS_DISABLE_VDSO
+	def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
index d7fe8408603e8..92b53d1df42c3 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -52,37 +52,11 @@ endif
 
 CFLAGS_REMOVE_vgettimeofday.o = -pg
 
-DISABLE_VDSO := n
-
-#
-# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
-# the base address of VDSO, the linker will emit a R_MIPS_PC32
-# relocation in binutils > 2.25 but it will fail with older versions
-# because that relocation is not supported for that symbol. As a result
-# of which we are forced to disable the VDSO symbols when building
-# with < 2.25 binutils on pre-R6 kernels. For more references on why we
-# can't use other methods to get the base address of VDSO please refer to
-# the comments on that file.
-#
-ifndef CONFIG_CPU_MIPSR6
-  ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
+ifdef CONFIG_MIPS_DISABLE_VDSO
+  ifndef CONFIG_MIPS_LD_CAN_LINK_VDSO
     $(warning MIPS VDSO requires binutils >= 2.25)
-    DISABLE_VDSO := y
   endif
-endif
-
-#
-# GCC (at least up to version 9.2) appears to emit function calls that make use
-# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
-# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
-#
-ifdef CONFIG_CPU_MICROMIPS
-  DISABLE_VDSO := y
-endif
-
-ifeq ($(DISABLE_VDSO),y)
   obj-vdso-y := $(filter-out vgettimeofday.o, $(obj-vdso-y))
-  ccflags-vdso += -DDISABLE_MIPS_VDSO
 endif
 
 # VDSO linker flags.
diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
index da4627430aba4..d90b65724d78e 100644
--- a/arch/mips/vdso/vdso.lds.S
+++ b/arch/mips/vdso/vdso.lds.S
@@ -91,7 +91,7 @@ PHDRS
 VERSION
 {
 	LINUX_2.6 {
-#ifndef DISABLE_MIPS_VDSO
+#ifndef CONFIG_MIPS_DISABLE_VDSO
 	global:
 		__vdso_clock_gettime;
 		__vdso_gettimeofday;
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v4 3/5] MIPS: Unconditionally specify '-EB' or '-EL'
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
  2020-04-28 22:14       ` [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
  2020-04-28 22:14       ` [PATCH v4 2/5] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
@ 2020-04-28 22:14       ` Nathan Chancellor
  2020-04-28 22:14       ` [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
                         ` (3 subsequent siblings)
  6 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28 22:14 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Fangrui Song, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek, Nathan Chancellor

This was all done to work around a GCC bug that has been fixed after
4.2. The kernel requires GCC 4.6 or newer so remove all of these hacks
and just use the traditional flags.

 $ mips64-linux-gcc --version | head -n1
 mips64-linux-gcc (GCC) 4.6.3

 $ mips64-linux-gcc -EB -dM -E -C -x c /dev/null | grep MIPSE
 #define MIPSEB 1
 #define __MIPSEB__ 1
 #define _MIPSEB 1
 #define __MIPSEB 1

 $ mips64-linux-gcc -EL -dM -E -C -x c /dev/null | grep MIPSE
 #define __MIPSEL__ 1
 #define MIPSEL 1
 #define _MIPSEL 1
 #define __MIPSEL 1

This is necessary when converting the MIPS VDSO to use $(LD) instead of
$(CC) to link because the OUTPUT_FORMAT is defaulted to little endian
and only flips to big endian when '-EB' is set on the command line.
There is no issue currently because the compiler explicitly passes
'-EB' or '-EL' to the linker regardless of whether or not it was
provided by the user. Passing '-v' to VDSO_LDFLAGS shows:

<gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/collect2 ... -EB ...

even though '-EB' is nowhere to be found in KBUILD_CFLAGS. The VDSO
Makefile already supports getting '-EB' or '-EL' from KBUILD_CFLAGS
through a filter directive but '-EB' or '-EL' is not always present.

If we do not do this, we will see the following error when compiling
for big endian:

$ make -j$(nproc) ARCH=mips CROSS_COMPILE=mips64-linux- \
  64r2el_defconfig arch/mips/vdso/
...
mips64-linux-ld: arch/mips/vdso/elf.o: compiled for a big endian system
and target is little endian
mips64-linux-ld: arch/mips/vdso/elf.o: endianness incompatible with that
of the selected emulation
mips64-linux-ld: failed to merge target specific data of file
arch/mips/vdso/elf.o
...

Remove this legacy hack and just use '-EB' and '-EL' unconditionally.

Reported-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v3 -> v4:

* New patch.

 arch/mips/Makefile | 25 -------------------------
 1 file changed, 25 deletions(-)

diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index e1c44aed81565..301efb90b51ed 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -116,33 +116,8 @@ endif
 
 cflags-y += -ffreestanding
 
-#
-# We explicitly add the endianness specifier if needed, this allows
-# to compile kernels with a toolchain for the other endianness. We
-# carefully avoid to add it redundantly because gcc 3.3/3.4 complains
-# when fed the toolchain default!
-#
-# Certain gcc versions up to gcc 4.1.1 (probably 4.2-subversion as of
-# 2006-10-10 don't properly change the predefined symbols if -EB / -EL
-# are used, so we kludge that here.  A bug has been filed at
-# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29413.
-#
-# clang doesn't suffer from these issues and our checks against -dumpmachine
-# don't work so well when cross compiling, since without providing --target
-# clang's output will be based upon the build machine. So for clang we simply
-# unconditionally specify -EB or -EL as appropriate.
-#
-ifdef CONFIG_CC_IS_CLANG
 cflags-$(CONFIG_CPU_BIG_ENDIAN)		+= -EB
 cflags-$(CONFIG_CPU_LITTLE_ENDIAN)	+= -EL
-else
-undef-all += -UMIPSEB -U_MIPSEB -U__MIPSEB -U__MIPSEB__
-undef-all += -UMIPSEL -U_MIPSEL -U__MIPSEL -U__MIPSEL__
-predef-be += -DMIPSEB -D_MIPSEB -D__MIPSEB -D__MIPSEB__
-predef-le += -DMIPSEL -D_MIPSEL -D__MIPSEL -D__MIPSEL__
-cflags-$(CONFIG_CPU_BIG_ENDIAN)		+= $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB $(undef-all) $(predef-be))
-cflags-$(CONFIG_CPU_LITTLE_ENDIAN)	+= $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL $(undef-all) $(predef-le))
-endif
 
 cflags-$(CONFIG_SB1XXX_CORELIS)	+= $(call cc-option,-mno-sched-prolog) \
 				   -fno-omit-frame-pointer
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
                         ` (2 preceding siblings ...)
  2020-04-28 22:14       ` [PATCH v4 3/5] MIPS: Unconditionally specify '-EB' or '-EL' Nathan Chancellor
@ 2020-04-28 22:14       ` Nathan Chancellor
  2020-04-28 22:54         ` Fangrui Song
  2020-05-02 13:50         ` Maciej W. Rozycki
  2020-04-28 22:14       ` [PATCH v4 5/5] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
                         ` (2 subsequent siblings)
  6 siblings, 2 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28 22:14 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Fangrui Song, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek, Nathan Chancellor

Currently, the VDSO is being linked through $(CC). This does not match
how the rest of the kernel links objects, which is through the $(LD)
variable.

When clang is built in a default configuration, it first attempts to use
the target triple's default linker then the system's default linker,
unless told otherwise through -fuse-ld=... We do not use -fuse-ld=
because it can be brittle and we have support for invoking $(LD)
directly. See commit fe00e50b2db8c ("ARM: 8858/1: vdso: use $(LD)
instead of $(CC) to link VDSO") and commit 691efbedc60d2 ("arm64: vdso:
use $(LD) instead of $(CC) to link VDSO") for examples of doing this in
the VDSO.

Do the same thing here. Replace the custom linking logic with $(cmd_ld)
and ldflags-y so that $(LD) is respected. We need to explicitly add two
flags to the linker that were implicitly passed by the compiler:
-G 0 (which comes from ccflags-vdso) and --eh-frame-hdr.

Before this patch (generated by adding '-v' to VDSO_LDFLAGS):

<gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/collect2 \
-plugin <gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/liblto_plugin.so \
-plugin-opt=<gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/lto-wrapper \
-plugin-opt=-fresolution=/tmp/ccGEi5Ka.res \
--eh-frame-hdr \
-G 0 \
-EB \
-mips64r2 \
-shared \
-melf64btsmip \
-o arch/mips/vdso/vdso.so.dbg.raw \
-L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0/64 \
-L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0 \
-L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0/../../../../mips64-linux/lib \
-Bsymbolic \
--no-undefined \
-soname=linux-vdso.so.1 \
-EB \
--hash-style=sysv \
--build-id \
-T arch/mips/vdso/vdso.lds \
arch/mips/vdso/elf.o \
arch/mips/vdso/vgettimeofday.o \
arch/mips/vdso/sigreturn.o

After this patch:

<gcc_prefix>/bin/mips64-linux-ld \
-m elf64btsmip \
-Bsymbolic \
--no-undefined \
-soname=linux-vdso.so.1 \
-EB \
-nostdlib \
-shared \
-G 0 \
--eh-frame-hdr \
--hash-style=sysv \
--build-id \
-T  arch/mips/vdso/vdso.lds \
arch/mips/vdso/elf.o \
arch/mips/vdso/vgettimeofday.o
arch/mips/vdso/sigreturn.o \
-o arch/mips/vdso/vdso.so.dbg.raw

Note that we leave behind -mips64r2. Turns out that ld ignores it (see
get_emulation in ld/ldmain.c). This is true of current trunk and 2.23,
which is the minimum supported version for the kernel:

https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/ldmain.c;hb=aa4209e7b679afd74a3860ce25659e71cc4847d5#l593
https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/ldmain.c;hb=a55e30b51bc6227d8d41f707654d0a5620978dcf#l641

Before this patch, LD=ld.lld did nothing:

$ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
String dump of section '.comment':
[     0] ClangBuiltLinux clang version 11.0.0

After this patch, it does:

$ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
String dump of section '.comment':
[     0] Linker: LLD 11.0.0
[    62] ClangBuiltLinux clang version 11.0.0

Link: https://github.com/ClangBuiltLinux/linux/issues/785
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
---

v3 -> v4:

* Improve commit message to show that ld command is effectively the
  same as the one generated by GCC.

* Add '-G 0' and '--eh-frame-hdr' because they were added by GCC.

v2 -> v3:

* New patch.

 arch/mips/vdso/Makefile | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
index 92b53d1df42c3..2e64c7600eead 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -60,10 +60,9 @@ ifdef CONFIG_MIPS_DISABLE_VDSO
 endif
 
 # VDSO linker flags.
-VDSO_LDFLAGS := \
-	-Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1 \
-	$(addprefix -Wl$(comma),$(filter -E%,$(KBUILD_CFLAGS))) \
-	-nostdlib -shared -Wl,--hash-style=sysv -Wl,--build-id
+ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
+	$(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
+	-G 0 --eh-frame-hdr --hash-style=sysv --build-id -T
 
 CFLAGS_REMOVE_vdso.o = -pg
 
@@ -82,11 +81,7 @@ quiet_cmd_vdso_mips_check = VDSOCHK $@
 #
 
 quiet_cmd_vdsold_and_vdso_check = LD      $@
-      cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check); $(cmd_vdso_mips_check)
-
-quiet_cmd_vdsold = VDSO    $@
-      cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
-                   -Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
+      cmd_vdsold_and_vdso_check = $(cmd_ld); $(cmd_vdso_check); $(cmd_vdso_mips_check)
 
 quiet_cmd_vdsoas_o_S = AS      $@
       cmd_vdsoas_o_S = $(CC) $(a_flags) -c -o $@ $<
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH v4 5/5] MIPS: VDSO: Allow ld.lld to link the VDSO
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
                         ` (3 preceding siblings ...)
  2020-04-28 22:14       ` [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
@ 2020-04-28 22:14       ` Nathan Chancellor
  2020-04-29  7:04       ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Sedat Dilek
  2020-05-12  8:05       ` Thomas Bogendoerfer
  6 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-28 22:14 UTC (permalink / raw)
  To: Thomas Bogendoerfer, Masahiro Yamada
  Cc: linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Fangrui Song, Sami Tolvanen, Dmitry Golovin,
	Sedat Dilek, Nathan Chancellor

Currently, when linking with ld.lld, this warning pops up:

    arch/mips/vdso/Makefile:70: MIPS VDSO requires binutils >= 2.25

CONFIG_LD_VERSION is set with scripts/ld-version.sh, which is specific
to GNU ld. It returns 0 for ld.lld so CONFIG_MIPS_LD_CAN_LINK_VDSO does
not set.

ld.lld has a completely different versioning scheme (as it follows
LLVM's versioning) and it does not have the issue mentioned in the
comment block so it should be allowed to link the VDSO.

With this patch, the VDSO successfully links and shows P_MIPS_PC32 in
vgettimeofday.o.

$ llvm-objdump -Dr arch/mips/vdso/vgettimeofday.o | grep R_MIPS_PC32
			00000024:  R_MIPS_PC32	_start
			000000b0:  R_MIPS_PC32	_start
			000002bc:  R_MIPS_PC32	_start
			0000036c:  R_MIPS_PC32	_start
			00000468:  R_MIPS_PC32	_start

Reported-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Link: https://github.com/ClangBuiltLinux/linux/issues/785
Link: https://github.com/llvm/llvm-project/commit/e364e2e9ce50c12eb2bf093560e1a1a8544d455a
---

v3 -> v4:

* No changes.

v2 -> v3:

* No changes.

v1 -> v2:

* Move into Kconfig so that the warning does not happen.

 arch/mips/vdso/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
index 36a52158d849b..7aec721398d59 100644
--- a/arch/mips/vdso/Kconfig
+++ b/arch/mips/vdso/Kconfig
@@ -12,7 +12,7 @@
 # the lack of relocations. As such, we disable the VDSO for microMIPS builds.
 
 config MIPS_LD_CAN_LINK_VDSO
-	def_bool LD_VERSION >= 225000000
+	def_bool LD_VERSION >= 225000000 || LD_IS_LLD
 
 config MIPS_DISABLE_VDSO
 	def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
-- 
2.26.2


^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-28 22:14       ` [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
@ 2020-04-28 22:54         ` Fangrui Song
  2020-04-29  0:44           ` Nathan Chancellor
  2020-05-02 13:34           ` Maciej W. Rozycki
  2020-05-02 13:50         ` Maciej W. Rozycki
  1 sibling, 2 replies; 41+ messages in thread
From: Fangrui Song @ 2020-04-28 22:54 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek


On 2020-04-28, Nathan Chancellor wrote:
>Currently, the VDSO is being linked through $(CC). This does not match
>how the rest of the kernel links objects, which is through the $(LD)
>variable.
>
>When clang is built in a default configuration, it first attempts to use
>the target triple's default linker then the system's default linker,
>unless told otherwise through -fuse-ld=... We do not use -fuse-ld=
>because it can be brittle and we have support for invoking $(LD)
>directly. See commit fe00e50b2db8c ("ARM: 8858/1: vdso: use $(LD)
>instead of $(CC) to link VDSO") and commit 691efbedc60d2 ("arm64: vdso:
>use $(LD) instead of $(CC) to link VDSO") for examples of doing this in
>the VDSO.
>
>Do the same thing here. Replace the custom linking logic with $(cmd_ld)
>and ldflags-y so that $(LD) is respected. We need to explicitly add two
>flags to the linker that were implicitly passed by the compiler:
>-G 0 (which comes from ccflags-vdso) and --eh-frame-hdr.
>
>Before this patch (generated by adding '-v' to VDSO_LDFLAGS):
>
><gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/collect2 \
>-plugin <gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/liblto_plugin.so \
>-plugin-opt=<gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/lto-wrapper \
>-plugin-opt=-fresolution=/tmp/ccGEi5Ka.res \
>--eh-frame-hdr \
>-G 0 \
>-EB \
>-mips64r2 \
>-shared \
>-melf64btsmip \
>-o arch/mips/vdso/vdso.so.dbg.raw \
>-L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0/64 \
>-L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0 \
>-L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0/../../../../mips64-linux/lib \
>-Bsymbolic \
>--no-undefined \
>-soname=linux-vdso.so.1 \
>-EB \
>--hash-style=sysv \
>--build-id \
>-T arch/mips/vdso/vdso.lds \
>arch/mips/vdso/elf.o \
>arch/mips/vdso/vgettimeofday.o \
>arch/mips/vdso/sigreturn.o
>
>After this patch:
>
><gcc_prefix>/bin/mips64-linux-ld \
>-m elf64btsmip \
>-Bsymbolic \
>--no-undefined \
>-soname=linux-vdso.so.1 \
>-EB \
>-nostdlib \
>-shared \
>-G 0 \
>--eh-frame-hdr \
>--hash-style=sysv \
>--build-id \
>-T  arch/mips/vdso/vdso.lds \
>arch/mips/vdso/elf.o \
>arch/mips/vdso/vgettimeofday.o
>arch/mips/vdso/sigreturn.o \
>-o arch/mips/vdso/vdso.so.dbg.raw
>
>Note that we leave behind -mips64r2. Turns out that ld ignores it (see
>get_emulation in ld/ldmain.c). This is true of current trunk and 2.23,
>which is the minimum supported version for the kernel:
>
>https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/ldmain.c;hb=aa4209e7b679afd74a3860ce25659e71cc4847d5#l593
>https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/ldmain.c;hb=a55e30b51bc6227d8d41f707654d0a5620978dcf#l641
>
>Before this patch, LD=ld.lld did nothing:
>
>$ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
>String dump of section '.comment':
>[     0] ClangBuiltLinux clang version 11.0.0
>
>After this patch, it does:
>
>$ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
>String dump of section '.comment':
>[     0] Linker: LLD 11.0.0
>[    62] ClangBuiltLinux clang version 11.0.0
>
>Link: https://github.com/ClangBuiltLinux/linux/issues/785
>Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
>---
>
>v3 -> v4:
>
>* Improve commit message to show that ld command is effectively the
>  same as the one generated by GCC.
>
>* Add '-G 0' and '--eh-frame-hdr' because they were added by GCC.

My understanding is that we start to use more -fasynchronous-unwind-tables to eliminate .eh_frame in object files.
Without .eh_frame, LD --eh-frame-hdr is really not useful.


Sigh...  -G 0. This is an option ignored by LLD. GCC devs probably should
have used the long option --gpsize rather than take the short option -G.
Even better, -z gpsize= or similar if this option is specific to ELF.

>v2 -> v3:
>
>* New patch.
>
> arch/mips/vdso/Makefile | 13 ++++---------
> 1 file changed, 4 insertions(+), 9 deletions(-)
>
>diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
>index 92b53d1df42c3..2e64c7600eead 100644
>--- a/arch/mips/vdso/Makefile
>+++ b/arch/mips/vdso/Makefile
>@@ -60,10 +60,9 @@ ifdef CONFIG_MIPS_DISABLE_VDSO
> endif
>
> # VDSO linker flags.
>-VDSO_LDFLAGS := \
>-	-Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1 \
>-	$(addprefix -Wl$(comma),$(filter -E%,$(KBUILD_CFLAGS))) \
>-	-nostdlib -shared -Wl,--hash-style=sysv -Wl,--build-id
>+ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
>+	$(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
>+	-G 0 --eh-frame-hdr --hash-style=sysv --build-id -T
>
> CFLAGS_REMOVE_vdso.o = -pg
>
>@@ -82,11 +81,7 @@ quiet_cmd_vdso_mips_check = VDSOCHK $@
> #
>
> quiet_cmd_vdsold_and_vdso_check = LD      $@
>-      cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check); $(cmd_vdso_mips_check)
>-
>-quiet_cmd_vdsold = VDSO    $@
>-      cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
>-                   -Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
>+      cmd_vdsold_and_vdso_check = $(cmd_ld); $(cmd_vdso_check); $(cmd_vdso_mips_check)
>
> quiet_cmd_vdsoas_o_S = AS      $@
>       cmd_vdsoas_o_S = $(CC) $(a_flags) -c -o $@ $<
>-- 
>2.26.2
>

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-28 22:54         ` Fangrui Song
@ 2020-04-29  0:44           ` Nathan Chancellor
  2020-05-02 13:34           ` Maciej W. Rozycki
  1 sibling, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-29  0:44 UTC (permalink / raw)
  To: Fangrui Song
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Tue, Apr 28, 2020 at 03:54:01PM -0700, Fangrui Song wrote:
> 
> On 2020-04-28, Nathan Chancellor wrote:
> > Currently, the VDSO is being linked through $(CC). This does not match
> > how the rest of the kernel links objects, which is through the $(LD)
> > variable.
> > 
> > When clang is built in a default configuration, it first attempts to use
> > the target triple's default linker then the system's default linker,
> > unless told otherwise through -fuse-ld=... We do not use -fuse-ld=
> > because it can be brittle and we have support for invoking $(LD)
> > directly. See commit fe00e50b2db8c ("ARM: 8858/1: vdso: use $(LD)
> > instead of $(CC) to link VDSO") and commit 691efbedc60d2 ("arm64: vdso:
> > use $(LD) instead of $(CC) to link VDSO") for examples of doing this in
> > the VDSO.
> > 
> > Do the same thing here. Replace the custom linking logic with $(cmd_ld)
> > and ldflags-y so that $(LD) is respected. We need to explicitly add two
> > flags to the linker that were implicitly passed by the compiler:
> > -G 0 (which comes from ccflags-vdso) and --eh-frame-hdr.
> > 
> > Before this patch (generated by adding '-v' to VDSO_LDFLAGS):
> > 
> > <gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/collect2 \
> > -plugin <gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/liblto_plugin.so \
> > -plugin-opt=<gcc_prefix>/libexec/gcc/mips64-linux/9.3.0/lto-wrapper \
> > -plugin-opt=-fresolution=/tmp/ccGEi5Ka.res \
> > --eh-frame-hdr \
> > -G 0 \
> > -EB \
> > -mips64r2 \
> > -shared \
> > -melf64btsmip \
> > -o arch/mips/vdso/vdso.so.dbg.raw \
> > -L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0/64 \
> > -L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0 \
> > -L<gcc_prefix>/lib/gcc/mips64-linux/9.3.0/../../../../mips64-linux/lib \
> > -Bsymbolic \
> > --no-undefined \
> > -soname=linux-vdso.so.1 \
> > -EB \
> > --hash-style=sysv \
> > --build-id \
> > -T arch/mips/vdso/vdso.lds \
> > arch/mips/vdso/elf.o \
> > arch/mips/vdso/vgettimeofday.o \
> > arch/mips/vdso/sigreturn.o
> > 
> > After this patch:
> > 
> > <gcc_prefix>/bin/mips64-linux-ld \
> > -m elf64btsmip \
> > -Bsymbolic \
> > --no-undefined \
> > -soname=linux-vdso.so.1 \
> > -EB \
> > -nostdlib \
> > -shared \
> > -G 0 \
> > --eh-frame-hdr \
> > --hash-style=sysv \
> > --build-id \
> > -T  arch/mips/vdso/vdso.lds \
> > arch/mips/vdso/elf.o \
> > arch/mips/vdso/vgettimeofday.o
> > arch/mips/vdso/sigreturn.o \
> > -o arch/mips/vdso/vdso.so.dbg.raw
> > 
> > Note that we leave behind -mips64r2. Turns out that ld ignores it (see
> > get_emulation in ld/ldmain.c). This is true of current trunk and 2.23,
> > which is the minimum supported version for the kernel:
> > 
> > https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/ldmain.c;hb=aa4209e7b679afd74a3860ce25659e71cc4847d5#l593
> > https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/ldmain.c;hb=a55e30b51bc6227d8d41f707654d0a5620978dcf#l641
> > 
> > Before this patch, LD=ld.lld did nothing:
> > 
> > $ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
> > String dump of section '.comment':
> > [     0] ClangBuiltLinux clang version 11.0.0
> > 
> > After this patch, it does:
> > 
> > $ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
> > String dump of section '.comment':
> > [     0] Linker: LLD 11.0.0
> > [    62] ClangBuiltLinux clang version 11.0.0
> > 
> > Link: https://github.com/ClangBuiltLinux/linux/issues/785
> > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> > ---
> > 
> > v3 -> v4:
> > 
> > * Improve commit message to show that ld command is effectively the
> >  same as the one generated by GCC.
> > 
> > * Add '-G 0' and '--eh-frame-hdr' because they were added by GCC.
> 
> My understanding is that we start to use more -fasynchronous-unwind-tables to eliminate .eh_frame in object files.
> Without .eh_frame, LD --eh-frame-hdr is really not useful.

Ah, I was not paying attention; I figured that this was necessary
because the x86 VDSO broke without it:

cd01544a268ad ("x86/vdso: Pass --eh-frame-hdr to the linker")

However, they explicitly add -fasynchronous-unwind-tables so it seems
like this indeed can be removed. Kind of odd that GCC passes it along
even with -fno-asynchronous-unwind-tables. I will do that in v5 once I
get some feedback on whether or not anything else breaks.

Cheers,
Nathan

> Sigh...  -G 0. This is an option ignored by LLD. GCC devs probably should
> have used the long option --gpsize rather than take the short option -G.
> Even better, -z gpsize= or similar if this option is specific to ELF.
> > v2 -> v3:
> > 
> > * New patch.
> > 
> > arch/mips/vdso/Makefile | 13 ++++---------
> > 1 file changed, 4 insertions(+), 9 deletions(-)
> > 
> > diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
> > index 92b53d1df42c3..2e64c7600eead 100644
> > --- a/arch/mips/vdso/Makefile
> > +++ b/arch/mips/vdso/Makefile
> > @@ -60,10 +60,9 @@ ifdef CONFIG_MIPS_DISABLE_VDSO
> > endif
> > 
> > # VDSO linker flags.
> > -VDSO_LDFLAGS := \
> > -	-Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1 \
> > -	$(addprefix -Wl$(comma),$(filter -E%,$(KBUILD_CFLAGS))) \
> > -	-nostdlib -shared -Wl,--hash-style=sysv -Wl,--build-id
> > +ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
> > +	$(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
> > +	-G 0 --eh-frame-hdr --hash-style=sysv --build-id -T
> > 
> > CFLAGS_REMOVE_vdso.o = -pg
> > 
> > @@ -82,11 +81,7 @@ quiet_cmd_vdso_mips_check = VDSOCHK $@
> > #
> > 
> > quiet_cmd_vdsold_and_vdso_check = LD      $@
> > -      cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check); $(cmd_vdso_mips_check)
> > -
> > -quiet_cmd_vdsold = VDSO    $@
> > -      cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
> > -                   -Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
> > +      cmd_vdsold_and_vdso_check = $(cmd_ld); $(cmd_vdso_check); $(cmd_vdso_mips_check)
> > 
> > quiet_cmd_vdsoas_o_S = AS      $@
> >       cmd_vdsoas_o_S = $(CC) $(a_flags) -c -o $@ $<
> > -- 
> > 2.26.2
> > 

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
                         ` (4 preceding siblings ...)
  2020-04-28 22:14       ` [PATCH v4 5/5] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
@ 2020-04-29  7:04       ` Sedat Dilek
  2020-04-30  3:06         ` Nathan Chancellor
  2020-05-12  8:05       ` Thomas Bogendoerfer
  6 siblings, 1 reply; 41+ messages in thread
From: Sedat Dilek @ 2020-04-29  7:04 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	Clang-Built-Linux ML, linux-kbuild, Nick Desaulniers,
	Fangrui Song, Sami Tolvanen, Dmitry Golovin

On Wed, Apr 29, 2020 at 12:14 AM Nathan Chancellor
<natechancellor@gmail.com> wrote:

> Patch 1 adds ld.lld support to Kconfig so that we can avoid certain
> ld.bfd checks.
>

Is it possible to introduce and add LD_IS_BFD Kconfig for ld.bfd in this series?
Most people agreed on this name AFAICS.
What do people think?

- Sedat -

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD
  2020-04-28 22:14       ` [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
@ 2020-04-29  7:13         ` Sedat Dilek
  2020-04-30  3:05           ` Nathan Chancellor
  0 siblings, 1 reply; 41+ messages in thread
From: Sedat Dilek @ 2020-04-29  7:13 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	Clang-Built-Linux ML, linux-kbuild, Nick Desaulniers,
	Fangrui Song, Sami Tolvanen, Dmitry Golovin

On Wed, Apr 29, 2020 at 12:14 AM Nathan Chancellor
<natechancellor@gmail.com> wrote:
>
> From: Sami Tolvanen <samitolvanen@google.com>
>
> Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
> specific logic such as ld-version or ld-ifversion and gain the
> ability to select potential features that depend on the linker at
> configuration time such as LTO.
>
> Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
> Acked-by: Masahiro Yamada <masahiroy@kernel.org>
> [nc: Reword commit message]
> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>

Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Reviewed-by: Sedat Dilek <sedat.dilek@gmail.com>

Testing on Debian/testing AMD64 (since Linux v5.3):
#1: LLVM/Clang/LLD version 9.0 and 10.0
#2: Debian's GCC 9.3 with ld.lld-9 and ld.lld-10

I am linking my Linux-kernels with ld.lld despite there are issues -
then check with ld.bfd.

- Sedat -

> ---
>
> v3 -> v4:
>
> * No changes.
>
> v2 -> v3:
>
> * Add Masahiro's ack.
>
> v1 -> v2:
>
> * No changes.
>
> Sami, please scream if you are unhappy with how I worded this commit.
>
>  init/Kconfig | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/init/Kconfig b/init/Kconfig
> index 9e22ee8fbd75e..c15ee42b82726 100644
> --- a/init/Kconfig
> +++ b/init/Kconfig
> @@ -23,6 +23,9 @@ config LD_VERSION
>  config CC_IS_CLANG
>         def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
>
> +config LD_IS_LLD
> +       def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
> +
>  config CLANG_VERSION
>         int
>         default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
>
> base-commit: 96c9a7802af7d500a582d89a8b864584fe878c1b
> --
> 2.26.2
>

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-27 23:24             ` Nathan Chancellor
@ 2020-04-29 17:46               ` Maciej W. Rozycki
  2020-04-30  3:14                 ` Nathan Chancellor
  0 siblings, 1 reply; 41+ messages in thread
From: Maciej W. Rozycki @ 2020-04-29 17:46 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Mon, 27 Apr 2020, Nathan Chancellor wrote:

> >  Can you actually record in the change description what the difference in 
> > the relevant link command is, as shown where `V=1' has been used with 
> > `make' invocation?
> 
> That will be rather unweildy to put in the commit message since
> currently, $(CC) + $(KBUILD_CFLAGS) is being used but I can if it is
> really desired. Otherwise, I can just put it where I put the changelog.

 Umm, is the difference so huge?  I think a note along the lines of:

"[...] This change adds/removes[*]:

<part of the command affected>

from the invocation of [...], which is required for [...]"

-- only quoting what's actually changed will be sufficient.  Reword as 
required.  Otherwise it's hard to guess now what the change actually does, 
and it will be even harder for someone who comes across it and tries to 
understand it the future, when the context might be hard to reproduce.

[*] Delete as appropriate.

  Maciej



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD
  2020-04-29  7:13         ` Sedat Dilek
@ 2020-04-30  3:05           ` Nathan Chancellor
  0 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-30  3:05 UTC (permalink / raw)
  To: Sedat Dilek
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	Clang-Built-Linux ML, linux-kbuild, Nick Desaulniers,
	Fangrui Song, Sami Tolvanen, Dmitry Golovin

On Wed, Apr 29, 2020 at 09:13:40AM +0200, Sedat Dilek wrote:
> On Wed, Apr 29, 2020 at 12:14 AM Nathan Chancellor
> <natechancellor@gmail.com> wrote:
> >
> > From: Sami Tolvanen <samitolvanen@google.com>
> >
> > Similarly to the CC_IS_CLANG config, add LD_IS_LLD to avoid GNU ld
> > specific logic such as ld-version or ld-ifversion and gain the
> > ability to select potential features that depend on the linker at
> > configuration time such as LTO.
> >
> > Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
> > Acked-by: Masahiro Yamada <masahiroy@kernel.org>
> > [nc: Reword commit message]
> > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> 
> Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
> Reviewed-by: Sedat Dilek <sedat.dilek@gmail.com>
> 
> Testing on Debian/testing AMD64 (since Linux v5.3):
> #1: LLVM/Clang/LLD version 9.0 and 10.0
> #2: Debian's GCC 9.3 with ld.lld-9 and ld.lld-10
> 
> I am linking my Linux-kernels with ld.lld despite there are issues -
> then check with ld.bfd.

What issues are these? Have they been reported?

Cheers,
Nathan

> - Sedat -
> 
> > ---
> >
> > v3 -> v4:
> >
> > * No changes.
> >
> > v2 -> v3:
> >
> > * Add Masahiro's ack.
> >
> > v1 -> v2:
> >
> > * No changes.
> >
> > Sami, please scream if you are unhappy with how I worded this commit.
> >
> >  init/Kconfig | 3 +++
> >  1 file changed, 3 insertions(+)
> >
> > diff --git a/init/Kconfig b/init/Kconfig
> > index 9e22ee8fbd75e..c15ee42b82726 100644
> > --- a/init/Kconfig
> > +++ b/init/Kconfig
> > @@ -23,6 +23,9 @@ config LD_VERSION
> >  config CC_IS_CLANG
> >         def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
> >
> > +config LD_IS_LLD
> > +       def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
> > +
> >  config CLANG_VERSION
> >         int
> >         default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
> >
> > base-commit: 96c9a7802af7d500a582d89a8b864584fe878c1b
> > --
> > 2.26.2
> >

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO
  2020-04-29  7:04       ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Sedat Dilek
@ 2020-04-30  3:06         ` Nathan Chancellor
  0 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-30  3:06 UTC (permalink / raw)
  To: Sedat Dilek
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	Clang-Built-Linux ML, linux-kbuild, Nick Desaulniers,
	Fangrui Song, Sami Tolvanen, Dmitry Golovin

On Wed, Apr 29, 2020 at 09:04:42AM +0200, Sedat Dilek wrote:
> On Wed, Apr 29, 2020 at 12:14 AM Nathan Chancellor
> <natechancellor@gmail.com> wrote:
> 
> > Patch 1 adds ld.lld support to Kconfig so that we can avoid certain
> > ld.bfd checks.
> >
> 
> Is it possible to introduce and add LD_IS_BFD Kconfig for ld.bfd in this series?
> Most people agreed on this name AFAICS.
> What do people think?
> 
> - Sedat -

What is the use case for LD_IS_BFD right now? I am not sure I see a
reason to add a CONFIG value that won't see any immediate use.

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-29 17:46               ` Maciej W. Rozycki
@ 2020-04-30  3:14                 ` Nathan Chancellor
  0 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-04-30  3:14 UTC (permalink / raw)
  To: Maciej W. Rozycki
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Wed, Apr 29, 2020 at 06:46:33PM +0100, Maciej W. Rozycki wrote:
> On Mon, 27 Apr 2020, Nathan Chancellor wrote:
> 
> > >  Can you actually record in the change description what the difference in 
> > > the relevant link command is, as shown where `V=1' has been used with 
> > > `make' invocation?
> > 
> > That will be rather unweildy to put in the commit message since
> > currently, $(CC) + $(KBUILD_CFLAGS) is being used but I can if it is
> > really desired. Otherwise, I can just put it where I put the changelog.
> 
>  Umm, is the difference so huge?  I think a note along the lines of:
> 
> "[...] This change adds/removes[*]:
> 
> <part of the command affected>
> 
> from the invocation of [...], which is required for [...]"
> 
> -- only quoting what's actually changed will be sufficient.  Reword as 
> required.  Otherwise it's hard to guess now what the change actually does, 
> and it will be even harder for someone who comes across it and tries to 
> understand it the future, when the context might be hard to reproduce.
> 
> [*] Delete as appropriate.
> 
>   Maciej

I ended up figuring out a way to get the difference proper into the
commit message in v4. Please take a look.

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-28 22:54         ` Fangrui Song
  2020-04-29  0:44           ` Nathan Chancellor
@ 2020-05-02 13:34           ` Maciej W. Rozycki
  1 sibling, 0 replies; 41+ messages in thread
From: Maciej W. Rozycki @ 2020-05-02 13:34 UTC (permalink / raw)
  To: Fangrui Song
  Cc: Nathan Chancellor, Thomas Bogendoerfer, Masahiro Yamada,
	linux-mips, linux-kernel, clang-built-linux, linux-kbuild,
	Nick Desaulniers, Sami Tolvanen, Dmitry Golovin, Sedat Dilek

On Tue, 28 Apr 2020, Fangrui Song wrote:

> Sigh...  -G 0. This is an option ignored by LLD. GCC devs probably should
> have used the long option --gpsize rather than take the short option -G.
> Even better, -z gpsize= or similar if this option is specific to ELF.

 Well, the `-G' option is some 30 years old and comes from RISC-OS where 
the vendor linker had it; it was already present with the initial MIPS 
port of GCC:

commit fe3ec4f798ceea52e1b542b481670b83c12347fd
Author: Michael Meissner <meissner@gcc.gnu.org>
Date:   Sun Dec 1 05:02:56 1991 +0000

    Initial revision

    From-SVN: r88

specifically:

+#define LINK_SPEC	"%{G*}						\

there, so I don't know of what GCC developers' choice you are talking 
about.

 Much of GCC legacy comes from various vendors' compilation systems; in 
this case it was the MIPS Computer Systems (aka MIPSCO) compiler.  There 
may not have been a GNU linker port to RISC-OS at that point (or ever), 
and the assembler and linker invocation interfaces were kept compatible as 
ports were added to individual GNU development tools, for obvious reasons.  
I still remember using GCC with vendor's assembler and linker on DEC 
Ultrix/MIPS myself many years ago, to overcome some vendor compiler's 
limitations.

 And FTR this was still a few years before ELF was even invented; MIPS OSs 
used the COFF binary format back then.

 Sorry.  I think it's LLVM/LLD that ignores compatibility, not the other 
way round.

  Maciej



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-04-28 22:14       ` [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
  2020-04-28 22:54         ` Fangrui Song
@ 2020-05-02 13:50         ` Maciej W. Rozycki
  2020-05-02 15:49           ` Nathan Chancellor
  1 sibling, 1 reply; 41+ messages in thread
From: Maciej W. Rozycki @ 2020-05-02 13:50 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Fangrui Song,
	Sami Tolvanen, Dmitry Golovin, Sedat Dilek

On Tue, 28 Apr 2020, Nathan Chancellor wrote:

> Before this patch, LD=ld.lld did nothing:
> 
> $ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
> String dump of section '.comment':
> [     0] ClangBuiltLinux clang version 11.0.0

 What does it mean "did nothing", is `arch/mips/vdso/vdso.so.dbg.raw' not 
produced?  Where does `arch/mips/vdso/vdso.so.dbg' come from then?

  Maciej



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO
  2020-05-02 13:50         ` Maciej W. Rozycki
@ 2020-05-02 15:49           ` Nathan Chancellor
  0 siblings, 0 replies; 41+ messages in thread
From: Nathan Chancellor @ 2020-05-02 15:49 UTC (permalink / raw)
  To: Maciej W. Rozycki
  Cc: Thomas Bogendoerfer, Masahiro Yamada, linux-mips, linux-kernel,
	clang-built-linux, linux-kbuild, Nick Desaulniers, Fangrui Song,
	Sami Tolvanen, Dmitry Golovin, Sedat Dilek

On Sat, May 02, 2020 at 02:50:34PM +0100, Maciej W. Rozycki wrote:
> On Tue, 28 Apr 2020, Nathan Chancellor wrote:
> 
> > Before this patch, LD=ld.lld did nothing:
> > 
> > $ llvm-readelf -p.comment arch/mips/vdso/vdso.so.dbg | sed 's/(.*//'
> > String dump of section '.comment':
> > [     0] ClangBuiltLinux clang version 11.0.0
> 
>  What does it mean "did nothing", is `arch/mips/vdso/vdso.so.dbg.raw' not 
> produced?  Where does `arch/mips/vdso/vdso.so.dbg' come from then?
> 
>   Maciej

A better wording might be "Before this patch, specifying a linker like
ld.lld via the LD variable was not respected by the MIPS VDSO". I should
also probably expand on the second paragraph, maybe something like:

When clang is built in a default configuration, it first attempts to use
the target triple's default linker then the system's default linker,
which is almost always ld.bfd. To use ld.lld, '-fuse-ld=lld' must be
passed to clang. However, we do not use -fuse-ld=lld because it can be
brittle and we have support for invoking $(LD) directly because we have
separate compilation and link steps. See commit fe00e50b2db8c ("ARM:
8858/1: vdso: use $(LD) instead of $(CC) to link VDSO") and
commit 691efbedc60d2 ("arm64: vdso: use $(LD) instead of $(CC) to link
VDSO") for examples of doing this in the VDSO.

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO
  2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
                         ` (5 preceding siblings ...)
  2020-04-29  7:04       ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Sedat Dilek
@ 2020-05-12  8:05       ` Thomas Bogendoerfer
  2020-05-12  8:28         ` Nathan Chancellor
  6 siblings, 1 reply; 41+ messages in thread
From: Thomas Bogendoerfer @ 2020-05-12  8:05 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Masahiro Yamada, linux-mips, linux-kernel, clang-built-linux,
	linux-kbuild, Nick Desaulniers, Fangrui Song, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Tue, Apr 28, 2020 at 03:14:14PM -0700, Nathan Chancellor wrote:
> [..]
> Please let me know if there are any issues!

I found no issues in my tests. Is this the final state ? If yes, I'm
going to apply it to mips-next.

Thomas.

-- 
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea.                                                [ RFC1925, 2.3 ]

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO
  2020-05-12  8:05       ` Thomas Bogendoerfer
@ 2020-05-12  8:28         ` Nathan Chancellor
  2020-05-13 11:18           ` Thomas Bogendoerfer
  0 siblings, 1 reply; 41+ messages in thread
From: Nathan Chancellor @ 2020-05-12  8:28 UTC (permalink / raw)
  To: Thomas Bogendoerfer
  Cc: Masahiro Yamada, linux-mips, linux-kernel, clang-built-linux,
	linux-kbuild, Nick Desaulniers, Fangrui Song, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Tue, May 12, 2020 at 10:05:09AM +0200, Thomas Bogendoerfer wrote:
> On Tue, Apr 28, 2020 at 03:14:14PM -0700, Nathan Chancellor wrote:
> > [..]
> > Please let me know if there are any issues!
> 
> I found no issues in my tests. Is this the final state ? If yes, I'm
> going to apply it to mips-next.
> 
> Thomas.
> 
> -- 
> Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
> good idea.                                                [ RFC1925, 2.3 ]

Maciej seemed to have some issue with the way I worded the commit
message of patch 4 but I have not heard anything back about my
suggestion and Fangrui commented that --eh-frame-hdr might not be
necessary but if everything works fine for you with this version, I
am not inclined to touch it.

If you feel this is good to go, I am happy to let it go in. Thanks for
accepting it!

Cheers,
Nathan

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO
  2020-05-12  8:28         ` Nathan Chancellor
@ 2020-05-13 11:18           ` Thomas Bogendoerfer
  0 siblings, 0 replies; 41+ messages in thread
From: Thomas Bogendoerfer @ 2020-05-13 11:18 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: Masahiro Yamada, linux-mips, linux-kernel, clang-built-linux,
	linux-kbuild, Nick Desaulniers, Fangrui Song, Sami Tolvanen,
	Dmitry Golovin, Sedat Dilek

On Tue, May 12, 2020 at 01:28:43AM -0700, Nathan Chancellor wrote:
> On Tue, May 12, 2020 at 10:05:09AM +0200, Thomas Bogendoerfer wrote:
> > On Tue, Apr 28, 2020 at 03:14:14PM -0700, Nathan Chancellor wrote:
> > > [..]
> > > Please let me know if there are any issues!
> > 
> > I found no issues in my tests. Is this the final state ? If yes, I'm
> > going to apply it to mips-next.
> > 
> > Thomas.
> > 
> > -- 
> > Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
> > good idea.                                                [ RFC1925, 2.3 ]
> 
> Maciej seemed to have some issue with the way I worded the commit
> message of patch 4 but I have not heard anything back about my
> suggestion and Fangrui commented that --eh-frame-hdr might not be
> necessary but if everything works fine for you with this version, I
> am not inclined to touch it.
> 
> If you feel this is good to go, I am happy to let it go in. Thanks for
> accepting it!

applied to mips-next.

Thomas.

-- 
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea.                                                [ RFC1925, 2.3 ]

^ permalink raw reply	[flat|nested] 41+ messages in thread

end of thread, other threads:[~2020-05-13 22:43 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-19 18:04 [PATCH 1/2] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
2020-04-19 18:04 ` [PATCH 2/2] MIPS: VDSO: Do not disable VDSO when linking with ld.lld Nathan Chancellor
2020-04-19 18:17   ` Nathan Chancellor
2020-04-19 19:32     ` Masahiro Yamada
2020-04-19 20:05       ` Nathan Chancellor
2020-04-19 20:21 ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
2020-04-19 20:21   ` [PATCH v2 2/3] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
2020-04-20  9:53     ` Sedat Dilek
2020-04-21  2:42       ` Nathan Chancellor
2020-04-23 14:41         ` Masahiro Yamada
2020-04-19 20:21   ` [PATCH v2 3/3] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
2020-04-23 14:38   ` [PATCH v2 1/3] kbuild: add CONFIG_LD_IS_LLD Masahiro Yamada
2020-04-23 17:18   ` [PATCH v3 1/4] " Nathan Chancellor
2020-04-23 17:18     ` [PATCH v3 2/4] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
2020-04-23 17:18     ` [PATCH v3 3/4] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
2020-04-26 16:27       ` Thomas Bogendoerfer
2020-04-27  2:08         ` Nathan Chancellor
2020-04-27 16:22           ` Maciej W. Rozycki
2020-04-27 23:24             ` Nathan Chancellor
2020-04-29 17:46               ` Maciej W. Rozycki
2020-04-30  3:14                 ` Nathan Chancellor
2020-04-28  2:17         ` Nathan Chancellor
2020-04-23 17:18     ` [PATCH v3 4/4] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
2020-04-28 22:14     ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Nathan Chancellor
2020-04-28 22:14       ` [PATCH v4 1/5] kbuild: add CONFIG_LD_IS_LLD Nathan Chancellor
2020-04-29  7:13         ` Sedat Dilek
2020-04-30  3:05           ` Nathan Chancellor
2020-04-28 22:14       ` [PATCH v4 2/5] MIPS: VDSO: Move disabling the VDSO logic to Kconfig Nathan Chancellor
2020-04-28 22:14       ` [PATCH v4 3/5] MIPS: Unconditionally specify '-EB' or '-EL' Nathan Chancellor
2020-04-28 22:14       ` [PATCH v4 4/5] MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO Nathan Chancellor
2020-04-28 22:54         ` Fangrui Song
2020-04-29  0:44           ` Nathan Chancellor
2020-05-02 13:34           ` Maciej W. Rozycki
2020-05-02 13:50         ` Maciej W. Rozycki
2020-05-02 15:49           ` Nathan Chancellor
2020-04-28 22:14       ` [PATCH v4 5/5] MIPS: VDSO: Allow ld.lld to link the VDSO Nathan Chancellor
2020-04-29  7:04       ` [PATCH v5 0/5] Allow ld.lld to link the MIPS VDSO Sedat Dilek
2020-04-30  3:06         ` Nathan Chancellor
2020-05-12  8:05       ` Thomas Bogendoerfer
2020-05-12  8:28         ` Nathan Chancellor
2020-05-13 11:18           ` Thomas Bogendoerfer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).