<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55330>55330</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Enable `LLVM_LINK_LLVM_DYLIB` and `VISIBILITY_PRESET=hidden` causes linker error
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          cloudhan
      </td>
    </tr>
</table>

<pre>
    Build with

```bash
#!/bin/bash

set -ev

projects="clang;clang-tools-extra;compiler-rt;lld;mlir"
targets="X86"
njobs=8

cmake -Bbuild -Sllvm "-GNinja" \
    "-DCMAKE_BUILD_TYPE=Release" \
    "-DLLVM_BUILD_LLVM_DYLIB=ON" \
    "-DLLVM_LINK_LLVM_DYLIB=ON" \
    "-DLLVM_BUILD_EXAMPLES=OFF" \
    "-DLLVM_ENABLE_PROJECTS=$projects" \
    "-DLLVM_TARGETS_TO_BUILD=$targets" \
    "-DLLVM_ENABLE_RTTI=ON"
    "-DCMAKE_C_VISIBILITY_PRESET=hidden" \
    "-DCMAKE_CXX_VISIBILITY_PRESET=hidden"

cmake --build build -- -j $njobs
```
will result various linker error. Remove CMAKE_C|CXX_VISIBILITY_PRESET=hidden from config will fix the problem. This might indicate a build system problem, e.g. LLVM should disallow VISIBILITY_PRESET if it cannot be built with it. While in https://github.com/llvm/llvm-project/blob/009d56da5c4ea3666c4753ce7564c8c20d7e0255/mlir/lib/CAPI/CMakeLists.txt#L36 the recommendation should be removed.

This is part of the final link error message happening on llvm-lto:
```
[1/1] Linking CXX executable bin/llvm-lto
FAILED: bin/llvm-lto
: && /usr/bin/c++ -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wsuggest-override -Wno-comment -Wmisleading-indentation -fdiagnostics-color -ffunction-sections -fdata-sections -O3 -DNDEBUG -Wl,-rpath-link,/home/cloud/llvm-project/build/./lib  -Wl,--gc-sections tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o -o bin/llvm-lto  -Wl,-rpath,"\$ORIGIN/../lib"  lib/libLLVM-15git.so && :
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::object_deleter<llvm::cl::SubCommand>::call(void*)':
llvm-lto.cpp:(.text._ZN4llvm14object_deleterINS_2cl10SubCommandEE4callEPv[_ZN4llvm14object_deleterINS_2cl10SubCommandEE4callEPv]+0x5c): undefined reference to `llvm::deallocate_buffer(void*, unsigned long, unsigned long)'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, llvm::cl::parser<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::printOptionInfo(unsigned long) const':
llvm-lto.cpp:(.text._ZNK4llvm2cl4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbNS0_6parserIS7_EEE15printOptionInfoEm[_ZNK4llvm2cl4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbNS0_6parserIS7_EEE15printOptionInfoEm]+0x15): undefined reference to `llvm::cl::basic_parser_impl::printOptionInfo(llvm::cl::Option const&, unsigned long) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<unsigned long, false, llvm::cl::parser<unsigned long> >::printOptionInfo(unsigned long) const':
llvm-lto.cpp:(.text._ZNK4llvm2cl3optImLb0ENS0_6parserImEEE15printOptionInfoEm[_ZNK4llvm2cl3optImLb0ENS0_6parserImEEE15printOptionInfoEm]+0x15): undefined reference to `llvm::cl::basic_parser_impl::printOptionInfo(llvm::cl::Option const&, unsigned long) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, llvm::cl::parser<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::getOptionWidth() const':
llvm-lto.cpp:(.text._ZNK4llvm2cl4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbNS0_6parserIS7_EEE14getOptionWidthEv[_ZNK4llvm2cl4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbNS0_6parserIS7_EEE14getOptionWidthEv]+0xf): undefined reference to `llvm::cl::basic_parser_impl::getOptionWidth(llvm::cl::Option const&) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<unsigned long, false, llvm::cl::parser<unsigned long> >::getOptionWidth() const':
llvm-lto.cpp:(.text._ZNK4llvm2cl3optImLb0ENS0_6parserImEEE14getOptionWidthEv[_ZNK4llvm2cl3optImLb0ENS0_6parserImEEE14getOptionWidthEv]+0xf): undefined reference to `llvm::cl::basic_parser_impl::getOptionWidth(llvm::cl::Option const&) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<unsigned long, false, llvm::cl::parser<unsigned long> >::handleOccurrence(unsigned int, llvm::StringRef, llvm::StringRef)':
llvm-lto.cpp:(.text._ZN4llvm2cl3optImLb0ENS0_6parserImEEE16handleOccurrenceEjNS_9StringRefES5_[_ZN4llvm2cl3optImLb0ENS0_6parserImEEE16handleOccurrenceEjNS_9StringRefES5_]+0x3e): undefined reference to `llvm::cl::parser<unsigned long>::parse(llvm::cl::Option&, llvm::StringRef, llvm::StringRef, unsigned long&)'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<ThinLTOModes, false, llvm::cl::parser<ThinLTOModes> >::printOptionInfo(unsigned long) const':
llvm-lto.cpp:(.text._ZNK4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE15printOptionInfoEm[_ZNK4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE15printOptionInfoEm]+0x15): undefined reference to `llvm::cl::generic_parser_base::printOptionInfo(llvm::cl::Option const&, unsigned long) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<ThinLTOModes, false, llvm::cl::parser<ThinLTOModes> >::getOptionWidth() const':
llvm-lto.cpp:(.text._ZNK4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE14getOptionWidthEv[_ZNK4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE14getOptionWidthEv]+0xf): undefined reference to `llvm::cl::generic_parser_base::getOptionWidth(llvm::cl::Option const&) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<unsigned long, false, llvm::cl::parser<unsigned long> >::printOptionValue(unsigned long, bool) const':
llvm-lto.cpp:(.text._ZNK4llvm2cl3optImLb0ENS0_6parserImEEE16printOptionValueEmb[_ZNK4llvm2cl3optImLb0ENS0_6parserImEEE16printOptionValueEmb]+0x65): undefined reference to `llvm::cl::parser<unsigned long>::printOptionDiff(llvm::cl::Option const&, unsigned long, llvm::cl::OptionValue<unsigned long>, unsigned long) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<ThinLTOModes, false, llvm::cl::parser<ThinLTOModes> >::printOptionValue(unsigned long, bool) const':
llvm-lto.cpp:(.text._ZNK4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE16printOptionValueEmb[_ZNK4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE16printOptionValueEmb]+0x79): undefined reference to `llvm::cl::generic_parser_base::printGenericOptionDiff(llvm::cl::Option const&, llvm::cl::GenericOptionValue const&, llvm::cl::GenericOptionValue const&, unsigned long) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<ThinLTOModes, false, llvm::cl::parser<ThinLTOModes> >::getExtraOptionNames(llvm::SmallVectorImpl<llvm::StringRef>&)':
llvm-lto.cpp:(.text._ZN4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE19getExtraOptionNamesERNS_15SmallVectorImplINS_9StringRefEEE[_ZN4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE19getExtraOptionNamesERNS_15SmallVectorImplINS_9StringRefEEE]+0xa0): undefined reference to `llvm::SmallVectorBase<unsigned int>::grow_pod(void*, unsigned long, unsigned long)'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `getThinLTOOldAndNewPrefix(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) [clone .constprop.0]':
llvm-lto.cpp:(.text._ZL25getThinLTOOldAndNewPrefixRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_.constprop.0+0x4b): undefined reference to `llvm::StringRef::find(llvm::StringRef, unsigned long) const'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::opt<ThinLTOModes, false, llvm::cl::parser<ThinLTOModes> >::handleOccurrence(unsigned int, llvm::StringRef, llvm::StringRef)':
llvm-lto.cpp:(.text._ZN4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE16handleOccurrenceEjNS_9StringRefES6_[_ZN4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE16handleOccurrenceEjNS_9StringRefES6_]+0x130): undefined reference to `llvm::errs()'
/usr/bin/ld: llvm-lto.cpp:(.text._ZN4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE16handleOccurrenceEjNS_9StringRefES6_[_ZN4llvm2cl3optI12ThinLTOModesLb0ENS0_6parserIS2_EEE16handleOccurrenceEjNS_9StringRefES6_]+0x184): undefined reference to `llvm::cl::Option::error(llvm::Twine const&, llvm::StringRef, llvm::raw_ostream&)'
/usr/bin/ld: tools/llvm-lto/CMakeFiles/llvm-lto.dir/llvm-lto.cpp.o: in function `llvm::cl::Option::Option(llvm::cl::NumOccurrencesFlag, llvm::cl::OptionHidden) [clone .constprop.0]':
llvm-lto.cpp:(.text._ZN4llvm2cl6OptionC2ENS0_18NumOccurrencesFlagENS0_12OptionHiddenE.constprop.0+0x3): undefined reference to `vtable for llvm::cl::Option'
/usr/bin/ld: llvm-lto.cpp:(.text._ZN4llvm2cl6OptionC2ENS0_18NumOccurrencesFlagENS0_12OptionHiddenE.constprop.0+0x85): undefined reference to `llvm::cl::getGeneralCategory()'
/usr/bin/ld: llvm-lto.cpp:(.text._ZN4llvm2cl6OptionC2ENS0_18NumOccurrencesFlagENS0_12OptionHiddenE.constprop.0+0xbd): undefined reference to `llvm::SmallVectorBase<unsigned int>::grow_pod(void*, unsigned long, unsigned long)'
...
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWltz4rgS_jXkRWWXMdjAQx4CcXI4w5BUYOdyXijZFqBZ2eJIci7767clGTAJYYBcNjU7Uxk7Vrf6-nVLchzz9OG0W1CWojuq5jXvvOadldfQsz8xlkuC36j59Zp_EdNcX9cEc5VEIYfcVocWgv8giZK1xnnN9xOG81mt0TV3R3HOpEPulcB6jGcLyohwhIInxlK4ZowKmGZFKSxmZCnpWztcEfIfPNbD7ariJMN_EuR0Y-ObM2LsNkMwxbkc0vwHht9QLehZXgT_NOm89_nsUzTp_tEfnE_G368jEHpDGMGSbOcfDL58LtnNr-ffB_0uTLoa7uAf9IefDmC34qNvZ5-vB9FIc19c7GCPhmfdQTS5vrn6b9Qbj0y0mqssPD9vfHZzGY1Hk_GV1WgnLmP-U30343F_6cnWoPYmX_qjfrc_6I-_g3XRKBoD_5ymKcl3JaP37dvumVuS7tikl6l3kPMDJDYtTDahbR_vKGNIEFkwhW6xoLyQiNH8TyIQEYILF92QjN8SVJpUa_V2m4Wmgmco4fmUzpCRPqX3SM0JgkzEjGQuGs-pRBmdzRWieUoTrAjCpcnyQSqSLXlrfg8Rd-YiHW8k57wAlpRKzBi_Q0-MQHSKqEIJznOuUEyMTGWqG8Zd9HUOVQY60VypBZQNFDXg6WIG9CJ2oQrhQRdLeXNK7OhyZzyGm-d10iBMcZA0CW6EYZg0W0EjIa0gbCbtxPfSFvH8IABWW78XjOp5vbPrvr59hhwNqFTSVfcgtjFohCY0goDyjOQpVpTnS0djTdDBT91qpk344GeBhUJ8agRMaY6ZSZxNG8qIlHhG0BwvFiSn-QyBXOMUU1x7vg0MtaCrO1y9FpyjAcjS0yDbiNyTpFAYMoJs91sJMtMuzvqDCKrmbCtVj9d8aFkh3C4KKVY9NKn5XfhBzvS634Nrzh1JMpwrmjg0V0QsuKQmIM70lkoaU0bVA5DATyKdEm_OV-MxABCiRxxFMyiDr4AQTdENFu4gucgLSVIHgoYzArJh9E5QmCCVAD8lPCdYKuf_BWZ2RkalBIozpYSloBVMwYz-RQTwLkhq7LScjAObvsAjzRaMJlQ5UzBBzQUvZvNSHn6ICdixlpRaAiwJUjoZuJ4kkDY7KEha5FqJY8rPjC2ASjP6l7ZqPZpzcp-QhXLUw0IPpdC2wa-c584tFQr8cVLFtcOymM0I-AhThaBpOd9CD5avr-AxdPxUi4fChDFcRj-leJZzCQ5LYGda2HRa5IkmQ87MXWo-rHDl-aqBnPPhedT94xKkM6hmRyywmjsaqPAEGJjzjGgoMF6kW8pO9wS4u7aS0FKKM0vWasxaWoVdWWgXUOzVcTe1Fbl8TBYLlyOHP0It2jDVWOnrDu03r276l_2hNsddVraPkK1wuOoe5dQD6Cau5CvIr0ptE_t6jT97melaAPSyZR4QlLFpXg1dcjzWIZxYLEBx9NakhNn7qIh7kHqcgylRSQLM1vz2LacQdTC5U_NbKw-q2k3vbLsKCsyd_G_Y1LR6c1NpfziawLan7q0VRVFTq4iub6HVHDkP1uaudx8k2jqIABQJge4HtSTIlAiSJwTCuhmMlOgFQ68zk7iYAlfVxx6IkHSmJegS3jJgovBPJHGZKQZLBqRQqtQ-TybJ_X29bh9gJ0qTie1iwJTMsdA-rJj1wATaINX7R0uGdFc5yuDoHrqko5InBt_0_alN0EilAdY7W7X8X1oB8tXVQoeun08h9O3HudNbEYjefjj-ZAAJ4GvqkAMQVav0qu5XPeonI1WvV3zoJ9EIwyWK4uHIm4Q2Ov1RawJD9eCRmVFm4f-O6mzV1IMDqmaZaWuJVTHRy9tzoX861ZKXKQi31dY6P_9khfGFLrAnjQDWcH3-2Yn_zUnvAc4GWNvPBrEXVZOf7YW0A-f-hs3vxnxUY4ajs83iV5rqXVT7g7Ti5qZh0e2bduIt2mxFTV-voJ5Eeo96-iDl8yZd9_WQt6NX_gxGh039jYk3xsQczhCMXCVJIUw8q0sxLEebckem0m_I9Nnhg45Fu9EQPjYt-gHHn85KWTQKJpWz0msIs2hrkCPg9myoK-QdaCvX8kNC_WTlDz_AecxidDyn-WB89ZmnWux-EN2Y8257xbpf1fsYOiN_v0PKy0S9YCc5IzkR6zYX679J_Hp7yTcA1SsvhXvlfq-V8VhJxy-Uz2Lo91L57KH1C2YFedqJloeP199VhY-VR1m8_8Zq-2wLmfCYvvOz1W6t7pxOp0d2n21pqoZ_i_Z_Uwt7Hzju1Y_2RecLhFmwtjqvvkheWurhaH3KtCHKmP6yCf8aKMNKE-m_R9pADHGmZVayMMowY19Iojg0NH2Sq_zNZr0j1vUfHnkE2QuZnS12RjdwjqgHjyzsbx4uomjLQeXtVdqawd4BNVMR2jV10ts4Da4SJvjdZMHTD_3XIghdGeErlp7l6ZDcXYPn9B6sfvf3kuEG2ztq7SDAXgIJIMg1_WMh-ML1DDr2qZOBHzwbyJtj3gbCSXvDEI3RZnwIRtcVrx-BPd3sFjvOyL9uD_0IL3L2W99_-iom3PZe5xVllwfuxiGNkQgh7TFxN3Z-zVC1m0fsu8o3W8vwcbFRpeM7EPPM_ugZeAp8N-HQXwjOPsbbrqqHy_d4WzaPwyJbh1leMLzzcPOf8hvGlzbuFSZCK7fnGxjU20_NsQS_qj960qMbP4XArf0QbsrFs869uHheyZn2cW_b7GkBsx5WZMbFwyt1hFdyKk4_3k7PdZdfaC4_qDxJTxtpp9HBJ4oqRk6j3KAGKFs_hA49BI1Kk3d88AtMCS4k2fxC96QQ7PTgD1qplIXpD0HQaHgn89NOJ0jiVoL1HqeeBK200_Hr7SBOwmDaiBvtE4ZjwuQplGvN93Nyh4wI83Hc-Qk99T3f9wKvXa97XtBwSdxM6p3Ub4SdMKi3vFrTIxmmzNV2uFzMTsSpMSkuZhKIzHwVuyJiaSJNjDqQjws15-LUfCYILf3E6D41tv8NpXVZhQ">