Build LLD on Windows 10 using ninja+llvm 18.1.6 + cmake

Good news, I got lld built at least using visual studio!

Using this command:

cmake -DLLVM_ENABLE_PROJECTS="lld" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl ..

The output:

-- Building for: Visual Studio 17 2022
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
-- The C compiler identification is MSVC 19.39.33523.0
-- The CXX compiler identification is MSVC 19.39.33523.0
-- The ASM compiler identification is MSVC
-- Found assembler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/cl.exe
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- bolt project is disabled
-- clang project is disabled
-- clang-tools-extra project is disabled
-- compiler-rt project is disabled
-- cross-project-tests project is disabled
-- libc project is disabled
-- libclc project is disabled
-- lld project is enabled
-- lldb project is disabled
-- mlir project is disabled
-- openmp project is disabled
-- polly project is disabled
-- pstl project is disabled
-- flang project is disabled
-- Found Python3: C:/ProgramData/miniconda3/python.exe (found suitable version "3.11.5", minimum required is "3.6") found components: Interpreter
-- Looking for dlfcn.h
-- Looking for dlfcn.h - not found
-- Looking for errno.h
-- Looking for errno.h - found
-- Looking for fcntl.h
-- Looking for fcntl.h - found
-- Looking for link.h
-- Looking for link.h - not found
-- Looking for malloc/malloc.h
-- Looking for malloc/malloc.h - not found
-- Looking for signal.h
-- Looking for signal.h - found
-- Looking for sys/ioctl.h
-- Looking for sys/ioctl.h - not found
-- Looking for sys/mman.h
-- Looking for sys/mman.h - not found
-- Looking for sys/param.h
-- Looking for sys/param.h - not found
-- Looking for sys/resource.h
-- Looking for sys/resource.h - not found
-- Looking for sys/stat.h
-- Looking for sys/stat.h - found
-- Looking for sys/time.h
-- Looking for sys/time.h - not found
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for sysexits.h
-- Looking for sysexits.h - not found
-- Looking for termios.h
-- Looking for termios.h - not found
-- Looking for unistd.h
-- Looking for unistd.h - not found
-- Looking for valgrind/valgrind.h
-- Looking for valgrind/valgrind.h - not found
-- Looking for fenv.h
-- Looking for fenv.h - found
-- Looking for FE_ALL_EXCEPT
-- Looking for FE_ALL_EXCEPT - found
-- Looking for FE_INEXACT
-- Looking for FE_INEXACT - found
-- Performing Test HAVE_BUILTIN_THREAD_POINTER
-- Performing Test HAVE_BUILTIN_THREAD_POINTER - Failed
-- Looking for mach/mach.h
-- Looking for mach/mach.h - not found
-- Looking for CrashReporterClient.h
-- Looking for CrashReporterClient.h - not found
-- Looking for pfm_initialize in pfm
-- Looking for pfm_initialize in pfm - not found
-- Found ZLIB: C:/ProgramData/miniconda3/Library/lib/z.lib (found version "1.2.13")
-- Looking for compress2
-- Looking for compress2 - found
-- Found LibXml2: C:/ProgramData/miniconda3/Library/lib/libxml2.lib (found version "2.10.4")
-- Looking for xmlReadMemory
-- Looking for xmlReadMemory - found
-- Looking for arc4random
-- Looking for arc4random - not found
-- Looking for backtrace
-- Looking for backtrace - not found
-- Could NOT find Backtrace (missing: Backtrace_LIBRARY Backtrace_INCLUDE_DIR)
-- Performing Test C_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW
-- Performing Test C_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW - Failed
-- Looking for __register_frame
-- Looking for __register_frame - not found
-- Looking for __deregister_frame
-- Looking for __deregister_frame - not found
-- Looking for __unw_add_dynamic_fde
-- Looking for __unw_add_dynamic_fde - not found
-- Looking for _Unwind_Backtrace
-- Looking for _Unwind_Backtrace - not found
-- Looking for getpagesize
-- Looking for getpagesize - not found
-- Looking for sysconf
-- Looking for sysconf - not found
-- Looking for getrusage
-- Looking for getrusage - not found
-- Looking for setrlimit
-- Looking for setrlimit - not found
-- Looking for isatty
-- Looking for isatty - not found
-- Looking for futimens
-- Looking for futimens - not found
-- Looking for futimes
-- Looking for futimes - not found
-- Looking for sigaltstack
-- Looking for sigaltstack - not found
-- Looking for mallctl
-- Looking for mallctl - not found
-- Looking for mallinfo
-- Looking for mallinfo - not found
-- Looking for mallinfo2
-- Looking for mallinfo2 - not found
-- Looking for malloc_zone_statistics
-- Looking for malloc_zone_statistics - not found
-- Looking for getrlimit
-- Looking for getrlimit - not found
-- Looking for posix_spawn
-- Looking for posix_spawn - not found
-- Looking for pread
-- Looking for pread - not found
-- Looking for sbrk
-- Looking for sbrk - not found
-- Looking for strerror_r
-- Looking for strerror_r - not found
-- Looking for strerror_s
-- Looking for strerror_s - found
-- Looking for setenv
-- Looking for setenv - not found
-- Looking for _chsize_s
-- Looking for _chsize_s - found
-- Looking for _alloca
-- Looking for _alloca - not found
-- Looking for __alloca
-- Looking for __alloca - not found
-- Looking for __chkstk
-- Looking for __chkstk - found
-- Looking for __chkstk_ms
-- Looking for __chkstk_ms - not found
-- Looking for ___chkstk
-- Looking for ___chkstk - not found
-- Looking for ___chkstk_ms
-- Looking for ___chkstk_ms - not found
-- Looking for __ashldi3
-- Looking for __ashldi3 - not found
-- Looking for __ashrdi3
-- Looking for __ashrdi3 - not found
-- Looking for __divdi3
-- Looking for __divdi3 - not found
-- Looking for __fixdfdi
-- Looking for __fixdfdi - not found
-- Looking for __fixsfdi
-- Looking for __fixsfdi - not found
-- Looking for __floatdidf
-- Looking for __floatdidf - not found
-- Looking for __lshrdi3
-- Looking for __lshrdi3 - not found
-- Looking for __moddi3
-- Looking for __moddi3 - not found
-- Looking for __udivdi3
-- Looking for __udivdi3 - not found
-- Looking for __umoddi3
-- Looking for __umoddi3 - not found
-- Looking for __main
-- Looking for __main - not found
-- Looking for __cmpdi2
-- Looking for __cmpdi2 - not found
-- Performing Test HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
-- Performing Test HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC - Failed
-- Performing Test HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
-- Performing Test HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC - Failed
-- Looking for __GLIBC__
-- Looking for __GLIBC__ - not found
-- Looking for proc_pid_rusage
-- Looking for proc_pid_rusage - not found
-- Performing Test LLVM_HAS_ATOMICS
-- Performing Test LLVM_HAS_ATOMICS - Success
-- Performing Test SUPPORTS_VARIADIC_MACROS_FLAG
-- Performing Test SUPPORTS_VARIADIC_MACROS_FLAG - Failed
-- Performing Test SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG
-- Performing Test SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG - Failed
-- LLVM host triple: x86_64-pc-windows-msvc
-- Native target architecture is X86
-- Threads enabled.
-- Doxygen disabled.
-- Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
-- OCaml bindings disabled.
-- Could NOT find Python module pygments
-- Could NOT find Python module pygments.lexers.c_cpp
-- Found Python module yaml
-- LLVM default target triple: x86_64-pc-windows-msvc
-- Looking for os_signpost_interval_begin
-- Looking for os_signpost_interval_begin - not found
-- Performing Test HAS_WERROR_GLOBAL_CTORS
-- Performing Test HAS_WERROR_GLOBAL_CTORS - Failed
-- Looking for _M_X64
-- Looking for _M_X64 - found
-- The ASM_MASM compiler identification is MSVC
-- Found assembler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/ml64.exe
-- Found Git: C:/Program Files/Git/cmd/git.exe (found version "2.37.3.windows.1")
-- LLVMHello ignored -- Loadable modules not supported on this platform.
-- Targeting AArch64
-- Targeting AMDGPU
-- Targeting ARM
-- Targeting AVR
-- Targeting BPF
-- Targeting Hexagon
-- Targeting Lanai
-- Targeting LoongArch
-- Targeting Mips
-- Targeting MSP430
-- Targeting NVPTX
-- Targeting PowerPC
-- Targeting RISCV
-- Targeting Sparc
-- Targeting SystemZ
-- Targeting VE
-- Targeting WebAssembly
-- Targeting X86
-- Targeting XCore
-- LLD version: 18.1.6
-- BugpointPasses ignored -- Loadable modules not supported on this platform.
-- git version: v0.0.0 normalized to 0.0.0
-- Version: 1.6.0
-- Looking for shm_open in rt
-- Looking for shm_open in rt - not found
-- Performing Test HAVE_CXX_FLAG_EHS_
-- Performing Test HAVE_CXX_FLAG_EHS_ - Success
-- Performing Test HAVE_CXX_FLAG_EHA_
-- Performing Test HAVE_CXX_FLAG_EHA_ - Success
-- Performing Test HAVE_GNU_POSIX_REGEX
-- Performing Test HAVE_GNU_POSIX_REGEX
-- Performing Test HAVE_GNU_POSIX_REGEX -- failed to compile
-- Performing Test HAVE_POSIX_REGEX
-- Performing Test HAVE_POSIX_REGEX
-- Performing Test HAVE_POSIX_REGEX -- failed to compile
CMake Warning at C:/Users/joschie/Desktop/Projects/llvm-project/third-party/benchmark/CMakeLists.txt:308 (message):
  Using std::regex with exceptions disabled is not fully supported


-- Performing Test HAVE_STEADY_CLOCK
-- Performing Test HAVE_STEADY_CLOCK
-- Performing Test HAVE_STEADY_CLOCK -- success
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - not found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/joschie/Desktop/Projects/llvm-project/llvm/build-clang-cl

And using visual studio. I wish I could be using llvm or mingw for this instead with clion. Be warned, the build took about 30mins to 1h or so… Maybe even longer. I checked VS for multi core support, and currently it does 16 parallel builds. Not sure why this default setup is so dead slow.

Visual Studio

Microsoft Visual Studio Community 2022
Version 17.9.7
VisualStudio.17.Release/17.9.7+34902.65
Microsoft .NET Framework
Version 4.8.09037

Installed Version: Community

I only built the lld solution and it produced:

  • C:\Users\joschie\Desktop\Projects\llvm-project\llvm\build\Debug\bin\lld-link.exe
  • C:\Users\joschie\Desktop\Projects\llvm-project\llvm\build\Debug\bin\lld.exe

How to test lld?

Still having trouble using this in my CMakeLists.txt test project, it seems to fall-back to ld no matter what I try so far. But the binary is built, which is already great!

cmake -DCMAKE_LINKER="C:\Users\joschie\Desktop\Projects\llvm-project\llvm\build\Debug\bin\lld-link.exe" -DCMAKE_C_FLAGS="-fuse-ld=lld"  ..

But then building it:

make clean
...

make VERBOSE=1
"C:\Program Files\CMake\bin\cmake.exe" -SC:\Users\joschie\Desktop\Projects\binutils-ld-experiments -BC:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build --check-build-system CMakeFiles\Makefile.cmake 0
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_progress_start C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\CMakeFiles C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\\CMakeFiles\progress.marks
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\Makefile2 all
make[1]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\mylib.dir\build.make CMakeFiles/mylib.dir/depend
make[2]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" C:\Users\joschie\Desktop\Projects\binutils-ld-experiments C:\Users\joschie\Desktop\Projects\binutils-ld-experiments C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\CMakeFiles\mylib.dir\DependInfo.cmake --color=
make[2]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\mylib.dir\build.make CMakeFiles/mylib.dir/build
make[2]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
[ 25%] Building C object CMakeFiles/mylib.dir/src/mylib.c.obj
C:\TDM-GCC-64\bin\gcc.exe -DMYLIB_EXPORTS -Dmylib_EXPORTS @CMakeFiles/mylib.dir/includes_C.rsp  -MD -MT CMakeFiles/mylib.dir/src/mylib.c.obj -MF CMakeFiles\mylib.dir\src\mylib.c.obj.d -o CMakeFiles\mylib.dir\src\mylib.c.obj -c C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\src\mylib.c
[ 50%] Linking C shared library libmylib.dll
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\mylib.dir\link.txt --verbose=1
"C:\Program Files\CMake\bin\cmake.exe" -E rm -f CMakeFiles\mylib.dir/objects.a
C:\TDM-GCC-64\bin\ar.exe qc CMakeFiles\mylib.dir/objects.a @CMakeFiles\mylib.dir\objects1.rsp
C:\TDM-GCC-64\bin\gcc.exe -shared -o libmylib.dll -Wl,--out-implib,libmylib.dll.a -Wl,--major-image-version,1,--minor-image-version,0 -Wl,--whole-archive CMakeFiles\mylib.dir/objects.a -Wl,--no-whole-archive @CMakeFiles\mylib.dir\linklibs.rsp
make[2]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
[ 50%] Built target mylib
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\test_mylib.dir\build.make CMakeFiles/test_mylib.dir/depend
make[2]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" C:\Users\joschie\Desktop\Projects\binutils-ld-experiments C:\Users\joschie\Desktop\Projects\binutils-ld-experiments C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\CMakeFiles\test_mylib.dir\DependInfo.cmake --color=
make[2]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\test_mylib.dir\build.make CMakeFiles/test_mylib.dir/build
make[2]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
[ 75%] Building C object CMakeFiles/test_mylib.dir/src/main.c.obj
C:\TDM-GCC-64\bin\gcc.exe  @CMakeFiles/test_mylib.dir/includes_C.rsp  -MD -MT CMakeFiles/test_mylib.dir/src/main.c.obj -MF CMakeFiles\test_mylib.dir\src\main.c.obj.d -o CMakeFiles\test_mylib.dir\src\main.c.obj -c C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\src\main.c
[100%] Linking C executable test_mylib.exe
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\test_mylib.dir\link.txt --verbose=1
"C:\Program Files\CMake\bin\cmake.exe" -E rm -f CMakeFiles\test_mylib.dir/objects.a
C:\TDM-GCC-64\bin\ar.exe qc CMakeFiles\test_mylib.dir/objects.a @CMakeFiles\test_mylib.dir\objects1.rsp
C:\TDM-GCC-64\bin\gcc.exe -Wl,--whole-archive CMakeFiles\test_mylib.dir/objects.a -Wl,--no-whole-archive -o test_mylib.exe -Wl,--out-implib,libtest_mylib.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\test_mylib.dir\linklibs.rsp
make[2]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
[100%] Built target test_mylib
make[1]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_progress_start C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\CMakeFiles 0

or

cmake -DCMAKE_LINKER="C:\Users\joschie\Desktop\Projects\llvm-project\llvm\build\Debug\bin\lld-link.exe" -DCMAKE_C_FLAGS="-fuse-ld=lld"
  ..
(base) PS C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build> make clean
(base) PS C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build> make VERBOSE=1
"C:\Program Files\CMake\bin\cmake.exe" -SC:\Users\joschie\Desktop\Projects\binutils-ld-experiments -BC:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build --check-build-system CMakeFiles\Makefile.cmake 0
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_progress_start C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\CMakeFiles C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\\CMakeFiles\progress.marks
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\Makefile2 all
make[1]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\mylib.dir\build.make CMakeFiles/mylib.dir/depend
make[2]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" C:\Users\joschie\Desktop\Projects\binutils-ld-experiments C:\Users\joschie\Desktop\Projects\binutils-ld-experiments C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\build\CMakeFiles\mylib.dir\DependInfo.cmake --color=
make[2]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe  -f CMakeFiles\mylib.dir\build.make CMakeFiles/mylib.dir/build
make[2]: Entering directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
[ 25%] Building C object CMakeFiles/mylib.dir/src/mylib.c.obj
C:\TDM-GCC-64\bin\gcc.exe -DMYLIB_EXPORTS -Dmylib_EXPORTS @CMakeFiles/mylib.dir/includes_C.rsp -fuse-ld=lld -MD -MT CMakeFiles/mylib.dir/src/mylib.c.obj -MF CMakeFiles\mylib.dir\src\mylib.c.obj.d -o CMakeFiles\mylib.dir\src\mylib.c.obj -c C:\Users\joschie\Desktop\Projects\binutils-ld-experiments\src\mylib.c
[ 50%] Linking C shared library libmylib.dll
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\mylib.dir\link.txt --verbose=1
"C:\Program Files\CMake\bin\cmake.exe" -E rm -f CMakeFiles\mylib.dir/objects.a
C:\TDM-GCC-64\bin\ar.exe qc CMakeFiles\mylib.dir/objects.a @CMakeFiles\mylib.dir\objects1.rsp
C:\TDM-GCC-64\bin\gcc.exe -fuse-ld=lld -shared -o libmylib.dll -Wl,--out-implib,libmylib.dll.a -Wl,--major-image-version,1,--minor-image-version,0 -Wl,--whole-archive CMakeFiles\mylib.dir/objects.a -Wl,--no-whole-archive @CMakeFiles\mylib.dir\linklibs.rsp
lld: error: unknown argument: --exclude-libs=libpthread.a
collect2.exe: error: ld returned 1 exit status
make[2]: *** [CMakeFiles\mylib.dir\build.make:99: libmylib.dll] Error 1
make[2]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
make[1]: *** [CMakeFiles\Makefile2:84: CMakeFiles/mylib.dir/all] Error 2
make[1]: Leaving directory 'C:/Users/joschie/Desktop/Projects/binutils-ld-experiments/build'
make: *** [Makefile:90: all] Error 2

Thanks for the help getting me this far!