ld.lld: error: undefined symbol: llvm::InitLLVM::InitLLVM(int&, char const**&, bool)
>>> referenced by llvm-ar-driver.cpp
>>>               CMakeFiles/llvm-ar.dir/llvm-ar-driver.cpp.o:(main)

From my attempt to build LLVM using LLVM_DISTRIBUTION_COMPONENTS, LLVM_BUILD_LLVM_DYLIB, CMAKE_INSTALL_PREFIX, DESTDIR (among others).
Verbose shows:

"/usr/bin/ld.lld" --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker \
/lib64/ld-linux-x86-64.so.2 -o ../../bin/llvm-ar /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../lib64/Scrt1.o \
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../lib64/crti.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/crtbeginS.o \
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../lib64 -L/lib/../lib64 \
-L/usr/lib/../lib64 -L/lib -L/usr/lib --gc-sections --dependency-file=CMakeFiles/llvm-ar.dir/link.d CMakeFiles/llvm-ar.dir/llvm-ar.cpp.o \
CMakeFiles/llvm-ar.dir/llvm-ar-driver.cpp.o -rpath "\$ORIGIN/../lib:/<pathTo>/build/lib:" ../../lib/libLLVM.so.21.0git -lstdc++ \
-lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/crtendS.o \
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../lib64/crtn.o

readelf for built lib/libLLVM.so.21.0git: 1725: 0000000000000000 0 FILE LOCAL DEFAULT ABS InitLLVM.cpp

And for lib/libLLVMSupport.a:

     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS InitLLVM.cpp
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 .text._ZN4llvm8InitLLVMC2ERiRPPKcb
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 .text._ZN4llvm8InitLLVMD2Ev
     5: 0000000000000000   235 FUNC    GLOBAL HIDDEN     3 llvm::InitLLVM::InitLLVM(int&, char const**&, bool)
    15: 0000000000000000    63 FUNC    GLOBAL HIDDEN     5 llvm::InitLLVM::~InitLLVM()
    22: 0000000000000000   235 FUNC    GLOBAL HIDDEN     3 llvm::InitLLVM::InitLLVM(int&, char const**&, bool)
    23: 0000000000000000    63 FUNC    GLOBAL HIDDEN     5 llvm::InitLLVM::~InitLLVM()

For the distribution comparison:

     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 .text._ZN4llvm8InitLLVMC2ERiRPPKcb
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 .text._ZN4llvm8InitLLVMD2Ev
     5: 0000000000000000   302 FUNC    GLOBAL DEFAULT    4 llvm::InitLLVM::InitLLVM(int&, char const**&, bool)
    16: 0000000000000000   302 FUNC    GLOBAL DEFAULT    4 llvm::InitLLVM::InitLLVM(int&, char const**&, bool)
    17: 0000000000000000   308 FUNC    GLOBAL DEFAULT    6 llvm::InitLLVM::~InitLLVM()
    21: 0000000000000000   308 FUNC    GLOBAL DEFAULT    6 llvm::InitLLVM::~InitLLVM()

FILE LOCAL DEFAULT ABS InitLLVM.cpp and HIDDEN seems key to finding a solution.

And for InitLLVM.cpp:

cd /<pathTo>/build/lib/Support && /usr/bin/clang++ -DGTEST_HAS_RTTI=0 -DLLVM_EXPORTS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS \
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/<pathTo>/build/lib/Support \
-I/<pathTo>/llvm_project/llvm/lib/Support -I/<pathTo>/build/include -I/<pathTo>/llvm_project/llvm/include -v -fPIC \
-fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra \
-Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi \
-Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override \
-Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -ffunction-sections -fdata-sections -Werror=global-constructors \
-O3 -DNDEBUG -std=c++17 -fvisibility=hidden -fvisibility-inlines-hidden  -fno-exceptions -funwind-tables -fno-rtti -MD \
-MT \lib/Support/CMakeFiles/LLVMSupport.dir/InitLLVM.cpp.o -MF CMakeFiles/LLVMSupport.dir/InitLLVM.cpp.o.d \
-o CMakeFiles/LLVMSupport.dir/InitLLVM.cpp.o -c /<pathTo>/llvm_project/llvm/lib/Support/InitLLVM.cpp

I had no role with -fvisibility=hidden -fvisibility-inlines-hidden being used.

EDIT0: Looks like it could be due to my addition of LLVM_BUILD_LLVM_DYLIB_VIS (seems very likely). Rebuilding now…

It looks like you found the issue (LLVM_BUILD_LLVM_DYLIB_VIS), but I wanted to confirm for posterity that I think you’re on the right track. That’s the off-by-default option that would enable -fvisbility=hidden, and it is still under development.

It was the issue.