[PATCH] riscv: Use -mno-relax when using lld linker

2 views
Skip to first unread message

Khem Raj

unread,
May 14, 2021, 4:57:00 PM5/14/21
to linux...@lists.infradead.org, clang-bu...@googlegroups.com, Khem Raj, Paul Walmsley, Palmer Dabbelt, Albert Ou, Nathan Chancellor, Nick Desaulniers
lld does not implement the RISCV relaxation optimizations like GNU ld
therefore disable it when building with LLVM=1, Also pass it to
assembler when using external GNU assembler ( LLVM_IAS != 1 ), this
ensures that relevant assembler option is also enabled along. if these
options are not used then we see following relocations in objects

0000000000000000 R_RISCV_ALIGN *ABS*+0x0000000000000002

These are then rejected by lld
ld.lld: error: capability.c:(.fixup+0x0): relocation R_RISCV_ALIGN requires unimplemented linker relaxation; recompile with -mno-relax but the .o is already compiled with -mno-relax

Signed-off-by: Khem Raj <raj....@gmail.com>
Cc: Paul Walmsley <paul.w...@sifive.com>
Cc: Palmer Dabbelt <pal...@dabbelt.com>
Cc: Albert Ou <a...@eecs.berkeley.edu>
Cc: Nathan Chancellor <nat...@kernel.org>
Cc: Nick Desaulniers <ndesau...@google.com>
---
arch/riscv/Makefile | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 3eb9590a0775..519f133e0d53 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -38,6 +38,15 @@ else
KBUILD_LDFLAGS += -melf32lriscv
endif

+ifeq ($(LLVM),1)
+ KBUILD_CFLAGS += -mno-relax
+ KBUILD_AFLAGS += -mno-relax
+ifneq ($(LLVM_IAS),1)
+ KBUILD_CFLAGS += -Wa,-mno-relax
+ KBUILD_AFLAGS += -Wa,-mno-relax
+endif
+endif
+
# ISA string setting
riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima
riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
--
2.31.1

Nathan Chancellor

unread,
May 14, 2021, 5:14:40 PM5/14/21
to Khem Raj, linux...@lists.infradead.org, clang-bu...@googlegroups.com, Paul Walmsley, Palmer Dabbelt, Albert Ou, Nick Desaulniers
Hi Khem,

On 5/14/2021 1:56 PM, Khem Raj wrote:
> lld does not implement the RISCV relaxation optimizations like GNU ld
> therefore disable it when building with LLVM=1, Also pass it to
> assembler when using external GNU assembler ( LLVM_IAS != 1 ), this
> ensures that relevant assembler option is also enabled along. if these
> options are not used then we see following relocations in objects
>
> 0000000000000000 R_RISCV_ALIGN *ABS*+0x0000000000000002
>
> These are then rejected by lld
> ld.lld: error: capability.c:(.fixup+0x0): relocation R_RISCV_ALIGN requires unimplemented linker relaxation; recompile with -mno-relax but the .o is already compiled with -mno-relax
>
> Signed-off-by: Khem Raj <raj....@gmail.com>
> Cc: Paul Walmsley <paul.w...@sifive.com>
> Cc: Palmer Dabbelt <pal...@dabbelt.com>
> Cc: Albert Ou <a...@eecs.berkeley.edu>
> Cc: Nathan Chancellor <nat...@kernel.org>
> Cc: Nick Desaulniers <ndesau...@google.com>

Thank you for the patch! I can build a ARCH=riscv defconfig kernel with
LLVM=1 now. LLVM_IAS=1 still needs work but we have outstanding issues
for that:

https://github.com/ClangBuiltLinux/linux/issues/1023
https://github.com/ClangBuiltLinux/linux/issues/1143

Reviewed-by: Nathan Chancellor <nat...@kernel.org>

One comment below though.

> ---
> arch/riscv/Makefile | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
> index 3eb9590a0775..519f133e0d53 100644
> --- a/arch/riscv/Makefile
> +++ b/arch/riscv/Makefile
> @@ -38,6 +38,15 @@ else
> KBUILD_LDFLAGS += -melf32lriscv
> endif
>
> +ifeq ($(LLVM),1)

ifeq ($(CONFIG_LD_IS_LLD),y)

is a better choice so that LD=riscv64-linux-gnu-ld LLVM=1 can still work.

Fāng-ruì Sòng

unread,
May 14, 2021, 5:14:57 PM5/14/21
to Khem Raj, linux...@lists.infradead.org, clang-built-linux, Paul Walmsley, Palmer Dabbelt, Albert Ou, Nathan Chancellor, Nick Desaulniers
On Fri, May 14, 2021 at 1:57 PM Khem Raj <raj....@gmail.com> wrote:
>
> lld does not implement the RISCV relaxation optimizations like GNU ld
> therefore disable it when building with LLVM=1, Also pass it to
> assembler when using external GNU assembler ( LLVM_IAS != 1 ), this
> ensures that relevant assembler option is also enabled along. if these
> options are not used then we see following relocations in objects
>
> 0000000000000000 R_RISCV_ALIGN *ABS*+0x0000000000000002
>
> These are then rejected by lld
> ld.lld: error: capability.c:(.fixup+0x0): relocation R_RISCV_ALIGN requires unimplemented linker relaxation; recompile with -mno-relax but the .o is already compiled with -mno-relax

This means -mno-relax should emit .option norelax in the assembly.
I'll try fixing this in Clang 13.
> --
> 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-li...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20210514205643.383422-1-raj.khem%40gmail.com.



--
宋方睿

Khem Raj

unread,
May 14, 2021, 5:37:48 PM5/14/21
to linux...@lists.infradead.org, clang-bu...@googlegroups.com, Khem Raj, Paul Walmsley, Palmer Dabbelt, Albert Ou, Nathan Chancellor, Nick Desaulniers
lld does not implement the RISCV relaxation optimizations like GNU ld
therefore disable it when building with lld, Also pass it to
assembler when using external GNU assembler ( LLVM_IAS != 1 ), this
ensures that relevant assembler option is also enabled along. if these
options are not used then we see following relocations in objects

0000000000000000 R_RISCV_ALIGN *ABS*+0x0000000000000002

These are then rejected by lld
ld.lld: error: capability.c:(.fixup+0x0): relocation R_RISCV_ALIGN requires unimplemented linker relaxation; recompile with -mno-relax but the .o is already compiled with -mno-relax

Signed-off-by: Khem Raj <raj....@gmail.com>
Cc: Paul Walmsley <paul.w...@sifive.com>
Cc: Palmer Dabbelt <pal...@dabbelt.com>
Cc: Albert Ou <a...@eecs.berkeley.edu>
Cc: Nathan Chancellor <nat...@kernel.org>
Cc: Nick Desaulniers <ndesau...@google.com>
---
v2: Use CONFIG_LD_IS_LLD instead of LLVM check

arch/riscv/Makefile | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 3eb9590a0775..4be020695428 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -38,6 +38,15 @@ else
KBUILD_LDFLAGS += -melf32lriscv
endif

+ifeq ($(CONFIG_LD_IS_LLD),y)

Nathan Chancellor

unread,
May 14, 2021, 5:41:05 PM5/14/21
to Khem Raj, linux...@lists.infradead.org, clang-bu...@googlegroups.com, Paul Walmsley, Palmer Dabbelt, Albert Ou, Nick Desaulniers
On 5/14/2021 2:37 PM, Khem Raj wrote:
> lld does not implement the RISCV relaxation optimizations like GNU ld
> therefore disable it when building with lld, Also pass it to
> assembler when using external GNU assembler ( LLVM_IAS != 1 ), this
> ensures that relevant assembler option is also enabled along. if these
> options are not used then we see following relocations in objects
>
> 0000000000000000 R_RISCV_ALIGN *ABS*+0x0000000000000002
>
> These are then rejected by lld
> ld.lld: error: capability.c:(.fixup+0x0): relocation R_RISCV_ALIGN requires unimplemented linker relaxation; recompile with -mno-relax but the .o is already compiled with -mno-relax
>
> Signed-off-by: Khem Raj <raj....@gmail.com>
> Cc: Paul Walmsley <paul.w...@sifive.com>
> Cc: Palmer Dabbelt <pal...@dabbelt.com>
> Cc: Albert Ou <a...@eecs.berkeley.edu>
> Cc: Nathan Chancellor <nat...@kernel.org>
> Cc: Nick Desaulniers <ndesau...@google.com>

Reviewed-by: Nathan Chancellor <nat...@kernel.org>

Palmer Dabbelt

unread,
May 29, 2021, 2:40:40 PM5/29/21
to Khem Raj, linux...@lists.infradead.org, clang-bu...@googlegroups.com, Khem Raj, Paul Walmsley, a...@eecs.berkeley.edu, nat...@kernel.org, ndesau...@google.com
Thanks, this is on fixes.

Palmer Dabbelt

unread,
May 29, 2021, 2:42:48 PM5/29/21
to Khem Raj, linux...@lists.infradead.org, clang-bu...@googlegroups.com, Khem Raj, Paul Walmsley, a...@eecs.berkeley.edu, nat...@kernel.org, ndesau...@google.com
Sorry, replied to the v1 but I merged the v2.
Reply all
Reply to author
Forward
0 new messages