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

    <tr>
        <th>Summary</th>
        <td>
            odr-violation for std::bad_function_call when building with sanitized libc++ in 14.0.0
        </td>
    </tr>

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

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

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

<pre>
    In llvm 14.0.0, I get an odr-violation when I link with a libc++ that was compiled with address-sanitizer. I did not previously see this warning when following the same steps using llvm 12.0.0.

I saw some issues in the [google/sanitizers repo](https://github.com/google/sanitizers) about odr-violation false positives, but I still opened this issue because I didn't think that would apply to linking with libc++ itself, and I didn't previously see this issue on older releases of llvm.

This is the warning I see:

```
$ LD_LIBRARY_PATH=/opt/llvm-14.0.0/libcxx-asan/lib:/opt/gcc-10.2.0/lib64 ./a.out
==783==The following global variable is not properly aligned.
==783==This may happen if another global with the same name
==783==resides in another non-instrumented module.
==783==Or the global comes from a C file built w/o -fno-common.
==783==In either case this is likely an ODR violation bug,
==783==but AddressSanitizer can not provide more details.
=================================================================
==783==ERROR: AddressSanitizer: odr-violation (0x000000231aa4):
  [1] size=28 'typeinfo name for std::__1::bad_function_call' /install/llvm-project-llvmorg-14.0.0/libcxx/src/functional.cpp
  [2] size=28 'typeinfo name for std::__1::bad_function_call' /install/llvm-project-llvmorg-14.0.0/libcxx/src/functional.cpp
These globals were registered at these points:
  [1]:
    #0 0x269c4a  (/home/jenkins/platform/a.out+0x269c4a)
    #1 0x7f820a2875fe  (/opt/llvm-14.0.0/libcxx-asan/lib/libc++.so.1+0xdc5fe)
    #2 0x7f820a3f99c2  (/lib64/ld-linux-x86-64.so.2+0xf9c2) (BuildId: 62c449974331341bb08dcce3859560a22af1e172)

  [2]:
    #0 0x269c4a  (/home/jenkins/platform/a.out+0x269c4a)
    #1 0x7f820a2875fe  (/opt/llvm-14.0.0/libcxx-asan/lib/libc++.so.1+0xdc5fe)
    #2 0x7f820a3f99c2  (/lib64/ld-linux-x86-64.so.2+0xf9c2) (BuildId: 62c449974331341bb08dcce3859560a22af1e172)

==783==HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_odr_violation=0
SUMMARY: AddressSanitizer: odr-violation: global 'typeinfo name for std::__1::bad_function_call' at /install/llvm-project-llvmorg-14.0.0/libcxx/src/functional.cpp
==783==ABORTING
```

My example has one file `main.cpp`.

```
#include <functional>

void call(std::function<void()> f) {
  f();
}

int main() {
  return 0;
}
```

My example is built like this:

```
/opt/llvm-14.0.0/bin/clang++                             \
    -fuse-ld=lld                                         \
    -fsanitize=address                                   \
    -nostdinc++                                          \
    -isystem /opt/llvm-14.0.0/libcxx-asan/include/c++/v1 \
    -nostdlib++                                          \
    -L /opt/llvm-14.0.0/libcxx-asan/lib                  \
    -lc++                                                \
    main.cpp
```

I run it by setting `LD_LIBRARY_PATH` to link with the sanitized libc++ and also to get libatomic from my gcc install:

```
$ LD_LIBRARY_PATH=/opt/llvm-14.0.0/libcxx-asan/lib:/opt/gcc-10.2.0/lib64 ./a.out
```

I built the sanitized libc++ by this command:

```
cmake3 ${src_dir}/runtimes                              \
    -DLLVM_USE_SANITIZER=Address                        \
    -DCMAKE_INSTALL_PREFIX=/opt/llvm-14.0.0/libcxx-asan \
    -DCMAKE_BUILD_TYPE=Release                          \
    -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi"           \
    -DCMAKE_C_COMPILER=/opt/llvm-14.0.0/bin/clang       \
    -DCMAKE_CXX_COMPILER=/opt/llvm-14.0.0/bin/clang++   \
    -DLLVM_USE_LINKER=lld

make -j$(nproc) install-cxx install-cxxabi
```

And I'm not sure this matters, but I built llvm with this command. It was built with a non-default install of gcc 10.2:

```
export LD_LIBRARY_PATH="/opt/gcc-10.2.0/lib64:/opt/gcc-10.2.0/lib:${LD_LIBRARY_PATH}"
export CC="/opt/gcc-10.2.0/bin/gcc"
export CXX="/opt/gcc-10.2.0/bin/g++"
export AR="/opt/gcc-10.2.0/bin/gcc-ar"
export CMAKE_AR="$AR"
export NM="/opt/gcc-10.2.0/bin/gcc-nm"
export RANLIB="/opt/gcc-10.2.0/bin/gcc-ranlib"
export CMAKE_RANLIB="$RANLIB"

cmake3 ${src_dir}/llvm                                              \
    -DCMAKE_INSTALL_PREFIX=${install_dir}                           \
    -DCMAKE_BUILD_TYPE=Release                                      \
    -DLLVM_LINK_LLVM_DYLIB=1                                        \
    -DLLVM_ENABLE_PROJECTS=clang;clang-tools-extra;lld              \
    -DLLVM_ENABLE_RUNTIMES=compiler-rt;libunwind;libcxx;libcxxabi   \
    -DLLVM_ENABLE_TERMINFO=OFF                                      \
    -DGCC_INSTALL_PREFIX=/opt/gcc-10.2.0                            \
    -DCMAKE_C_COMPILER=/opt/gcc-10.2.0/bin/gcc                      \
    -DCMAKE_CXX_COMPILER=/opt/gcc-10.2.0/bin/g++                    \
    -DCMAKE_EXE_LINKER_FLAGS=" -static-libgcc -static-libstdc++"    \
    -DCMAKE_SHARED_LINKER_FLAGS=" -static-libgcc -static-libstdc++" \
    -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON

make -j$(nproc) install
```


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWVtz4joS_jXkRWXK2Ob2wIO5zXgPgRQhW5l9ccm2DJoREiXLuZxfvy3JJoQQAmfOw9mqpSiwZelTq9X9dbeciOx1EHHE2NMWtYKm23Qb3ghFaE0UwhyJTDpPVDCsqODoeUM4PGOU_0LPVG0QhuskbXhD-CK1wQo94wKlYrujjGRVnyyTpCicAnOq6J9ENgEioxniQqGdJABfFuwVFYQABC0AQnLK13a2XDAmnvWt2hBU4C38KLIrUFnoRiu3p-VuNtxxww3tbwRdn1EhoDstipIUiHKD0GgP10KsGWl4071EBZJkJxrtccPrbZTaFQ0_hOfwXcMKyqQJK9I3Hwc2vD7CiSjVkaZyzAqCdqKAfk-k0DpNoBOIpShjSOwIB_2Y5Rr5UEJSXMIQoxre8LpKPwU9W62KkmUI73agJyXMBhgNaf0e7ABVBWG5ngzz7BDqlJrtvCCrYBmRoAFGcAGKErnR6jt1ruwAo8F6eyINpRV10K_RcauvvfUCNBvHs2i4DJc_4rtw9b3hg5KnYqfgV0_j1EY31et4eXEwKNfe2U2wXddp6rTcplf37ASoCVe4Caqv5gJgf9zt-fZiBZK-2c6aiQQz9IQlxQnTNlFZH2yEBKVgRtewIc1PoKD7Fr-iDWwAmCTNQb0CVCFrXLMPe_vk8HMSCNyAZtYUawAuuEN5oWS5JVyBSWxFVjJyWpCFNJNUk4JNAlYuxRbccIRy8DiwMcrAWrTakJNz4UCnreCn4cDtCTVSpLDxtVGAPf0iWiUcLcZL9GbSSbkGyzqJpE07tG5-X7sGgPJayU-wbFiZJCgjClNWvBPof_t7Sh-T5XKxBPP9oBTd9p4ogHHcF9d8PL-FcQCMsncqpOmqBbyEChgNwF4PaX9-3RHKc2EsDaxcAqtkepAfxnHLXiQ4i_OSp3qSOMWMwTgYO9XGZu6s98Hm_CSpcvSNkOtjb9RcJ4FdpjUUZs10tzuQzvunSgcEUNS-AjGFgPFJsqYQPCS4Gdb0SgxFU66Kjxo_aIE2z3eR--J1-mmA9W0PJt2A_8HfT6K5GBh-uoMtheVu97zkDesxelMP0VqA1s17nou9XredkxrzMl60bZbzm4VotsxMWQpAxxN5-4n8vN9PvXoiQ6H6P3MgmJQvzkuv43QCjeYZtBw66-AG3YdAKlmktxB1vDQI-v1u4PstP2glidvL0pT4vXa_3YHFeDhvkVbX24txZCn_1-rfqNUj0vkezVcaDcLTqyhRJmzoTzFYvk1RrMUTKQVkPLqPDmoFJHrhfTiPF3eraDG_ByQgafC6GIgq3hMVNFdB_f7h9hai-UX0phuqcPU7zADe-veSw5HqwuFiuYrm304nMeb39hWRF7zdQZDdQIorOLERF7ptMeUGuvM-B_2QDPmUp6yEUNjwR29SNfzJ4agnAamxXXhvr566NwzUz421QZiYoNxYU3dYm2deP6paGt3xIThwHdLi2l6HAyVRpeTIPTHyC3VAymDTDp04mCziq6TwpEMmWqppyjBfV9nsuU-jPXrzSCeHzNlhoKsxgzT50s8RRp3UA0pVslyNwQXsGGzyBQs4g0KLV4hSW3QRc1UmpVVnZ4Wrp9YpuQzH_Y5cs8skgruvkNjVGjqBsne7z600QrKEfF2hxPCc0qUAdDkuSTpuXVQdZvLWGrLD-kpXVZBNCN1dF8jwCCuxpalNw7evCOoUVPPUP6c0Oq0b67WfLhZ0ZkoCXULAws8vJ93iX8QHAwmAU4B344xKzSDeFHZAUV2pXGFp49ns37fxw_0khsAUraL_TJaapc975RHE6Db8YxJH8_tVOJvFd8vJNHq8SMOngYYPEWzX6sfdBECWtla-bjmTeTicTeLlw3wV3U7ujSxeFav8ob3ACYXGrxY1ikeL27toZrTyNZ2ehXp8vA5s77if7dgsmv9hsICKDw1GGwhyfmoL8XocgneqI1DlKw6s_fBa6-Fz0w314QbkBVtTXxalrIrXLVbKnMnUhy1VXNJnRJVjv9lzE0X2tKqqme1xlq7HM5LjEpoqefSBiHZr7WPnnYC87IRUJ93aO-Ou55zZPNM-dQzaNaCH045G52ayWwhNH4Y9Pl4wro4t78eGy4umdLD8MKuxvrfxAVwedZnfXgbOt8cjl-EcdHXZaIm5CYynxHuPE1S3ddeviM-Y3VWfSxlMT1UZZzXdtaDXsdkZOOP22uVjczX-YRXW-otLPiTKu-XiX5PRShOlZR5_aP4dJQQrHPKiJNbEeZzxXca91Rm1dKSy7FvyZ6qj3PAjJZ8HXU2Wt9F8utAHdNPpX1r2t9HoTKR6s9wrIM9FitOucA3sJ1Hjc-a4GHryWIeQeDoLv1VhEjlg7YqmUFYnWtSDW8hs95mv9yns_fdwORn_DvIxbLX8eLmKx5Np-DBbxatw-W2yihfz2Q9tDPOLw9-ZWHeTDfys7_fxjaKKkcHRa4bDGvpD6WzfoOj4lu3fFpxM9Siv3v3clJINzrwB0Zx2VH_rGsS8YYGLdtDr-DebQdpNO67r9nvE6-dBP-1n3XaAvTzoua1e2vZuGE4IKwaNtlYtJ8_2ZYSm1vb4hg481_PcoOW5ncBru812m3QCN-n67X67lQZ5I3AJZP-sad5TQO1_IwdGpKRcF_CQ0UIVbw9xUejTfWKmA3xcqo2Qg0RSYBNJCCfy9cYIMDAL-C_ExYf3">