[PATCH v3 0/3] Fully support standalone Clang/LLVM toolchains

Xiang W wxjstz at 126.com
Fri Jul 9 06:46:18 PDT 2021


在 2021-07-09星期五的 05:12 +0100,Jessica Clarke写道:
I tested these patches. Some bugs reported

ld.lld: error: can't create dynamic relocation R_RISCV_32 against
symbol: _fw_start in readonly segment; recompile object files with -
fPIC or pass '-Wl,-z,notext' to allow text relocations in the output
>>> defined in
/home/merle/workspaces/opensbi/build/platform/generic/firmware/fw_dynam
ic.elf.ld:9
>>> referenced by fw_base.S:502
(/home/merle/workspaces/opensbi/firmware/fw_base.S:502)
>>>              
/home/merle/workspaces/opensbi/build/platform/generic/firmware/fw_dynam
ic.o:(.entry+0x3BC)

Data is stored in the code segment of base.S. Can be fix by:

diff --git a/firmware/fw_base.S b/firmware/fw_base.S
index ee2a51b..f8aea05 100644
--- a/firmware/fw_base.S
+++ b/firmware/fw_base.S
@@ -501,6 +501,7 @@ _skip_trap_exit_rv32_hyp:
        /* We don't expect to reach here hence just hang */
        j       _start_hang
 
+       .data
        .align 3
 #ifdef FW_PIC
 _runtime_offset:




> This patch series is comprised of three parts.
> 
> The first patch fixes a warning seen when building with LLVM due to a
> bogus combination of assembly directives.
> 
> The second patch adds build system support for using Clang and LLVM
> binutils, provided your Clang is able to locate a libgcc.a in its
> search
> path.
> 
> However, pure LLVM toolchains do not use libgcc, they use compiler-rt
> (libclang_rt.builtins.<arch>.a). We could change the Makefile to not
> hard-code -lgcc and instead use -print-libgcc-file-name, but that
> still
> requires a bare metal compiler-rt built for the right -march/-mabi to
> be
> present, which is often not the case. Moreover, we need very little
> from
> libgcc/compiler-rt; RV64 needs nothing, and RV32 only needs 64-bit
> division. Thus, the third patch vendors part of FreeBSD's libquad and
> stops linking against libgcc entirely, allowing OpenSBI to be built
> with
> just a cross-compiler. This means that building with any distro-
> provided
> LLVM just works, as does compiling with the system Clang compiler and
> LLD linker on FreeBSD without any external packages needed (beyond
> GNU
> make).
> 
> Changes in v3:
>   * Fixed the binding warning seen when building with LLVM
>   * Provide a default -target when CROSS_COMPILE isn't set so the
>     variable isn't normally required to be set when cross-compiling
> with
>     LLVM (but is still honoured if set).
>   * Pass -fuse=bfd when not using LLD to ensure an ld.bfd gets
> correctly
>     picked up over a plain ld when ld is LLD. Now we always
> explicitly
>     request Clang and GCC use the linker type corresponding to LD.
> This
>     allows BFD to be used on FreeBSD for testing purposes despite LLD
>     being the system linker.
> 
> Changes in v2:
>   * Add documentation to README.md
>   * Pass -fuse-ld=lld to Clang when using LLD
>   * Modify commit message of first commit to explain -N -> -Wl,-N
> change
>   * Bring back the old ?= uses for the non-CROSS_COMPILE (and, now,
>     non-LLVM) case; whilst I still think that's how it should be,
> it's
>     not required for this patch, just related cleanup I did to reduce
>     the complexity of adding the LLVM case.
> 
> Jessica Clarke (3):
>   fw_base: Don't mark fw_platform_init as both global and weak
>   Makefile: Support building with Clang and LLVM binutils
>   Drop dependency on libgcc by importing part of FreeBSD's libquad
> 
>  Makefile                              |  65 +++++-
>  README.md                             |  43 +++-
>  firmware/fw_base.S                    |   1 -
>  lib/utils/libquad/divdi3.c            |  64 ++++++
>  lib/utils/libquad/include/limits.h    |  12 ++
>  lib/utils/libquad/include/sys/cdefs.h |  12 ++
>  lib/utils/libquad/include/sys/types.h |  25 +++
>  lib/utils/libquad/moddi3.c            |  66 ++++++
>  lib/utils/libquad/objects.mk          |  14 ++
>  lib/utils/libquad/qdivrem.c           | 278
> ++++++++++++++++++++++++++
>  lib/utils/libquad/quad.h              | 105 ++++++++++
>  lib/utils/libquad/udivdi3.c           |  52 +++++
>  lib/utils/libquad/umoddi3.c           |  54 +++++
>  13 files changed, 782 insertions(+), 9 deletions(-)
>  create mode 100644 lib/utils/libquad/divdi3.c
>  create mode 100644 lib/utils/libquad/include/limits.h
>  create mode 100644 lib/utils/libquad/include/sys/cdefs.h
>  create mode 100644 lib/utils/libquad/include/sys/types.h
>  create mode 100644 lib/utils/libquad/moddi3.c
>  create mode 100644 lib/utils/libquad/objects.mk
>  create mode 100644 lib/utils/libquad/qdivrem.c
>  create mode 100644 lib/utils/libquad/quad.h
>  create mode 100644 lib/utils/libquad/udivdi3.c
>  create mode 100644 lib/utils/libquad/umoddi3.c
> 
> -- 
> 2.31.0
> 
> 





More information about the opensbi mailing list