<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">