From f9ab04b63aee614ddfd3b50a4c6a0eac2094a2fe Mon Sep 17 00:00:00 2001 From: Arnaud Vrac Date: Tue, 19 Sep 2023 12:42:19 +0200 Subject: [PATCH] Add mold linker build Allows building the #mold linker, which can then be used in the cross-toolchain by passing the -fuse-ld=mold to the gcc flags. It is much faster than ld or gold. This requires a C++20 compiler and cmake. Initially implemented by Arnaud, and HC added configure check for cmake. Outstanding task to validate compiler is C++20 compatible. Signed-off-by: Arnaud Vrac Signed-off-by: Hans-Christian Noren Egtvedt --- bootstrap | 1 + config/config.in | 1 + config/linker.in | 12 ++++++++++ config/linker/mold.in | 7 ++++++ ct-ng.in | 1 + packages/mold/2.31.0/chksum | 4 ++++ packages/mold/2.31.0/version.desc | 0 packages/mold/package.desc | 4 ++++ scripts/build/linker.sh | 38 +++++++++++++++++++++++++++++++ scripts/build/linker/100-mold.sh | 38 +++++++++++++++++++++++++++++++ scripts/crosstool-NG.sh | 2 ++ scripts/functions | 1 + scripts/show-config.sh | 1 + 13 files changed, 110 insertions(+) create mode 100644 config/linker.in create mode 100644 config/linker/mold.in create mode 100644 packages/mold/2.31.0/chksum create mode 100644 packages/mold/2.31.0/version.desc create mode 100644 packages/mold/package.desc create mode 100644 scripts/build/linker.sh create mode 100644 scripts/build/linker/100-mold.sh diff --git a/bootstrap b/bootstrap index dab89d9b..7c54e007 100755 --- a/bootstrap +++ b/bootstrap @@ -796,6 +796,7 @@ gen_selection choice kernel "Target OS" gen_selection choice cc "Compiler" gen_selection choice binutils "Binutils" gen_selection choice libc "C library" +gen_selection menu linker "Linkers" gen_selection menu debug "Debug facilities" gen_selection menu comp_tools "Companion tools" gen_selection menu comp_libs "Companion libraries" diff --git a/config/config.in b/config/config.in index bbde6a66..47effa53 100644 --- a/config/config.in +++ b/config/config.in @@ -8,6 +8,7 @@ source "config/kernel.in" source "config/binutils.in" source "config/libc.in" source "config/cc.in" +source "config/linker.in" source "config/debug.in" source "config/comp_libs.in" source "config/comp_tools.in" diff --git a/config/linker.in b/config/linker.in new file mode 100644 index 00000000..b17f77fd --- /dev/null +++ b/config/linker.in @@ -0,0 +1,12 @@ +menu "Linkers" + +if BINUTILS_LINKER_LD || BINUTILS_LINKER_BOTH +comment "BFD enabled in binutils" +endif # BINUTILS_LINKER_LD +if BINUTILS_LINKER_GOLD || BINUTILS_LINKER_BOTH +comment "GOLD enabled in binutils" +endif # BINUTILS_LINKER_GOLD + +source "config/gen/linker.in" + +endmenu diff --git a/config/linker/mold.in b/config/linker/mold.in new file mode 100644 index 00000000..2e605a91 --- /dev/null +++ b/config/linker/mold.in @@ -0,0 +1,7 @@ +# mold options + +config LINKER_MOLD_has_cmake + def_bool $(success,which cmake) + +comment "mold requires cmake" + depends on !LINKER_MOLD_has_cmake diff --git a/ct-ng.in b/ct-ng.in index 75e09ac5..f0a0f573 100644 --- a/ct-ng.in +++ b/ct-ng.in @@ -275,6 +275,7 @@ CT_STEPS := \ companion_tools_for_host \ companion_libs_for_host \ binutils_for_host \ + linker \ libc_headers \ kernel_headers \ cc_core \ diff --git a/packages/mold/2.31.0/chksum b/packages/mold/2.31.0/chksum new file mode 100644 index 00000000..b9aafe4e --- /dev/null +++ b/packages/mold/2.31.0/chksum @@ -0,0 +1,4 @@ +md5sum v2.31.0.tar.gz fdfcddefc039071f5a7611c051a8f5ea +sha1sum v2.31.0.tar.gz 0168ecab12d87a6197cfec4824a3e82115c6a2bd +sha256sum v2.31.0.tar.gz 3dc3af83a5d22a4b29971bfad17261851d426961c665480e2ca294e5c74aa1e5 +sha512sum v2.31.0.tar.gz 343c62d8c67b74988f762c46999d2d866b2e9a0c69d2b910b12384ea5abc620b30468cd1b1bacfe41474d1c97c8ce2e49d55ca70479691238fb73d83d9adc683 diff --git a/packages/mold/2.31.0/version.desc b/packages/mold/2.31.0/version.desc new file mode 100644 index 00000000..e69de29b diff --git a/packages/mold/package.desc b/packages/mold/package.desc new file mode 100644 index 00000000..76f82073 --- /dev/null +++ b/packages/mold/package.desc @@ -0,0 +1,4 @@ +repository='git https://github.com/rui314/mold.git' +mirrors='https://github.com/rui314/mold/archive/refs/tags' +archive_filename='v@{version}' +archive_formats='.tar.gz' diff --git a/scripts/build/linker.sh b/scripts/build/linker.sh new file mode 100644 index 00000000..235d7cf6 --- /dev/null +++ b/scripts/build/linker.sh @@ -0,0 +1,38 @@ +# Wrapper to build the standalone linkers + +# List all linkers, and parse their scripts +CT_LINKER_LIST= +for f in "${CT_LIB_DIR}/scripts/build/linker/"*.sh; do + _f="$(basename "${f}" .sh)" + _f="${_f#???-}" + __f="CT_LINKER_${_f^^}" + if [ "${!__f}" = "y" ]; then + CT_DoLog DEBUG "Enabling linker '${_f}'" + . "${f}" + CT_LINKER_LIST="${CT_LINKER_LIST} ${_f}" + else + CT_DoLog DEBUG "Disabling linker '${_f}'" + fi +done + +# Download the linkers +do_linker_get() { + for f in ${CT_LINKER_LIST}; do + do_linker_${f}_get + done +} + +# Extract and patch the linkers +do_linker_extract() { + for f in ${CT_LINKER_LIST}; do + do_linker_${f}_extract + done +} + +# Build the linkers +do_linker() { + for f in ${CT_LINKER_LIST}; do + do_linker_${f}_build + done +} + diff --git a/scripts/build/linker/100-mold.sh b/scripts/build/linker/100-mold.sh new file mode 100644 index 00000000..710ca969 --- /dev/null +++ b/scripts/build/linker/100-mold.sh @@ -0,0 +1,38 @@ +# Build script for the mold linker + +do_linker_mold_get() { + CT_Fetch MOLD +} + +do_linker_mold_extract() { + CT_ExtractPatch MOLD +} + +do_linker_mold_build() { + local target_dir="${CT_PREFIX_DIR}/${CT_TARGET}" + + CT_DoStep INFO "Installing mold for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-mold" + + CT_DoLog EXTRA "Configuring mold for host" + CT_DoExecLog CFG \ + CFLAGS="${CT_CFLAGS_FOR_HOST}" \ + LDFLAGS="${CT_LDFLAGS_FOR_HOST}" \ + cmake "${CT_SRC_DIR}/mold" \ + -DBUILD_TESTING=OFF \ + -DMOLD_MOSTLY_STATIC=ON \ + -DCMAKE_BUILD_TYPE=Release + + CT_DoLog EXTRA "Building mold for host" + CT_DoExecLog ALL make ${CT_JOBSFLAGS} + + CT_DoLog EXTRA "Installing mold for host" + mkdir -p "${target_dir}/bin" + cp mold "${target_dir}/bin" + ln -s mold "${target_dir}/bin/ld.mold" + mkdir -p "${target_dir}/lib/mold" + cp mold-wrapper.so "${target_dir}/lib/mold" + + CT_Popd + CT_EndStep +} diff --git a/scripts/crosstool-NG.sh b/scripts/crosstool-NG.sh index 900dcb18..fdcfe4b3 100644 --- a/scripts/crosstool-NG.sh +++ b/scripts/crosstool-NG.sh @@ -660,6 +660,7 @@ if [ -z "${CT_RESTART}" ]; then do_companion_libs_get do_binutils_get do_cc_get + do_linker_get do_libc_get do_debug_get do_test_suite_get @@ -677,6 +678,7 @@ if [ -z "${CT_RESTART}" ]; then do_companion_libs_extract do_binutils_extract do_cc_extract + do_linker_extract do_libc_extract do_debug_extract do_test_suite_extract diff --git a/scripts/functions b/scripts/functions index a86c528f..0453fe32 100644 --- a/scripts/functions +++ b/scripts/functions @@ -25,6 +25,7 @@ CT_LoadConfig() { . "${CT_LIB_DIR}/scripts/build/binutils/${CT_BINUTILS}.sh" . "${CT_LIB_DIR}/scripts/build/libc.sh" . "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh" + . "${CT_LIB_DIR}/scripts/build/linker.sh" . "${CT_LIB_DIR}/scripts/build/debug.sh" . "${CT_LIB_DIR}/scripts/build/test_suite.sh" diff --git a/scripts/show-config.sh b/scripts/show-config.sh index 36ade9ec..295e29e3 100644 --- a/scripts/show-config.sh +++ b/scripts/show-config.sh @@ -96,6 +96,7 @@ dump_single_sample() dump_pkgs_desc KERNEL "OS" dump_pkgs_desc BINUTILS "Binutils" dump_pkgs_desc CC "Compiler" + dump_pkgs_desc LINKER "Linkers" dump_pkgs_desc LIBC "C library" dump_pkgs_desc DEBUG "Debug tools" dump_pkgs_desc COMP_LIBS "Companion libs"