Open
Description
I observed that compiling and linking with the flags -fsanitize=<sanitizer>
and -fxray-instrument
produces a huge list of duplicate symbol linker errors.
For example, the compile command clang -fsanitize=address -fxray-instrument test.c
outputs the following:
ld.lld: error: duplicate symbol: __sanitizer::internal_allocator()
>>> defined at sanitizer_allocator.cpp:38 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:38)
>>> sanitizer_allocator.cpp.o:(__sanitizer::internal_allocator()) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.a
>>> defined at sanitizer_allocator.cpp:38 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:38)
>>> sanitizer_allocator.cpp.o:(.text._ZN11__sanitizer18internal_allocatorEv+0x0) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.xray-x86_64.a
ld.lld: error: duplicate symbol: __sanitizer::InternalAlloc(unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*, unsigned long)
>>> defined at sanitizer_allocator.cpp:86 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:86)
>>> sanitizer_allocator.cpp.o:(__sanitizer::InternalAlloc(unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*, unsigned long)) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.a
>>> defined at sanitizer_allocator.cpp:86 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:86)
>>> sanitizer_allocator.cpp.o:(.text._ZN11__sanitizer13InternalAllocEmPNS_30SizeClassAllocator32LocalCacheINS_20SizeClassAllocator32INS_4AP32EEEEEm+0x0) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.xray-x86_64.a
ld.lld: error: duplicate symbol: __sanitizer::errno_EOWNERDEAD
>>> defined at sanitizer_errno.cpp
>>> sanitizer_errno.cpp.o:(__sanitizer::errno_EOWNERDEAD) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.a
>>> defined at sanitizer_errno.cpp
>>> sanitizer_errno.cpp.o:(.rodata._ZN11__sanitizer16errno_EOWNERDEADE+0x0) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.xray-x86_64.a
ld.lld: error: duplicate symbol: __sanitizer::InternalRealloc(void*, unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*)
>>> defined at sanitizer_allocator.cpp:93 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:93)
>>> sanitizer_allocator.cpp.o:(__sanitizer::InternalRealloc(void*, unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*)) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.a
>>> defined at sanitizer_allocator.cpp:93 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:93)
>>> sanitizer_allocator.cpp.o:(.text._ZN11__sanitizer15InternalReallocEPvmPNS_30SizeClassAllocator32LocalCacheINS_20SizeClassAllocator32INS_4AP32EEEEE+0x0) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.xray-x86_64.a
ld.lld: error: duplicate symbol: __sanitizer::InternalReallocArray(void*, unsigned long, unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*)
>>> defined at sanitizer_allocator.cpp:101 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:101)
>>> sanitizer_allocator.cpp.o:(__sanitizer::InternalReallocArray(void*, unsigned long, unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*)) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.a
>>> defined at sanitizer_allocator.cpp:101 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:101)
>>> sanitizer_allocator.cpp.o:(.text._ZN11__sanitizer20InternalReallocArrayEPvmmPNS_30SizeClassAllocator32LocalCacheINS_20SizeClassAllocator32INS_4AP32EEEEE+0x0) in archive /home/linuxbrew/.linuxbrew/Cellar/llvm/17.0.6/lib/clang/17/lib/linux/libclang_rt.xray-x86_64.a
ld.lld: error: duplicate symbol: __sanitizer::InternalCalloc(unsigned long, unsigned long, __sanitizer::SizeClassAllocator32LocalCache<__sanitizer::SizeClassAllocator32<__sanitizer::AP32>>*)
>>> defined at sanitizer_allocator.cpp:112 (/tmp/llvm-20231128-6780-l667df/llvm-project-17.0.6.src/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp:112)
...
I assume this is not the desired behavior. If -fsanitize=address
and -fxray-instrument
are mutually exclusive, then clang
should refuse to compile the program, rather than produce a linker error.