Xmake Version
3.1.1
Operating System Version and Architecture
Arch Linux
Describe Bug
Cycling between debug and release modes twice appears to break release mode if using sanitizers on debug. I used LLMs to try to find a root cause and fix but failed. Invalid description below left for posterity. The repro, however, is valid.
The below is based on a conversation with an LLM. I don't have the experience to fully verify.
#6983 enabled stripping of sanitizer flags for the purpose of better reuse. This is wrong as pointed out by Gemini Code Assist. This breaks my builds when switching between modes with/without sanitizers.
Repro:
rm -rf build .xmake
xmake f -m debug; xmake # C1D ok
xmake f -m release; xmake # C1R ok, distinct objs
xmake f -m debug; xmake -v # C2D BUG
xmake f -m release; xmake # C2R fails with asan
Expected Behavior
Builds are not spuriously broken when switching modes.
Project Configuration
add_rules("mode.debug", "mode.release")
if is_mode("debug") then
add_rules("plugin.compile_commands.autoupdate", {outputdir = "build"})
set_policy("build.sanitizer.address", true)
set_policy("build.sanitizer.undefined", true)
end
if is_mode("release") then
set_policy("build.optimization.lto", true)
end
set_toolchains("clang")
add_ldflags("-fuse-ld=lld", {force = false})
set_languages("c++26")
set_warnings("allextra")
target("foo")
set_kind("binary")
add_files("src/*.cppm")
Additional Information and Error Logs
/usr/sbin/clang++ -o build/linux/x86_64/release/foo build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o build/.objs/foo/linux/x86_64/release/src/main.cppm.o -m64 -s -fuse-ld=lld -flto=thin
ld.lld: error: undefined symbol: __asan_before_dynamic_init
>>> referenced by std.pcm:0 (/usr/include/c++/16/bits/std.pcm:0)
>>> build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o:(initializer for module std)
ld.lld: error: undefined symbol: __asan_after_dynamic_init
>>> referenced by std.pcm:0 (/usr/include/c++/16/bits/std.pcm:0)
>>> build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o:(initializer for module std)
ld.lld: error: undefined symbol: __asan_init
>>> referenced by std.pcm
>>> build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o:(asan.module_ctor)
ld.lld: error: undefined symbol: __asan_version_mismatch_check_v8
>>> referenced by std.pcm
>>> build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o:(asan.module_ctor)
ld.lld: error: undefined symbol: __asan_register_elf_globals
>>> referenced by std.pcm
>>> build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o:(asan.module_ctor)
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
error: @programdir/core/main.lua:274: @programdir/actions/build/main.lua:162: @programdir/modules/async/runjobs.lua:282: @programdir/modules/private/action/build/link_objects.lua:56: @programdir/core/sandbox/modules/os.lua:378: execv(/usr/sbin/clang++ -o build/linux/x86_64/release/foo build/.objs/foo/linux/x86_64/release/usr/include/c++/16/bits/std.cc.o build/.objs/foo/linux/x86_64/release/src/main.cppm.o -m64 -s -fuse-ld=lld -flto=thin) failed(1), unknown reason
stack traceback:
[C]: in function 'error'
[@programdir/core/base/os.lua:1204]:
[@programdir/core/sandbox/modules/os.lua:378]: in function 'execv'
[@programdir/modules/core/tools/gcc.lua:963]:
[C]: in function 'xpcall'
[@programdir/core/base/utils.lua:299]:
[@programdir/core/tool/linker.lua:245]: in function 'link'
[@programdir/modules/private/action/build/link_objects.lua:56]: in function 'callback'
[@programdir/modules/core/project/depend.lua:247]: in function 'on_changed'
[@programdir/modules/private/action/build/link_objects.lua:39]: in function '_do_link_target'
[@programdir/modules/private/action/build/link_objects.lua:77]: in function 'job_func'
[@programdir/modules/async/runjobs.lua:462]:
[C]: in function 'xpcall'
[@programdir/core/base/utils.lua:299]: in function 'trycall'
[@programdir/core/sandbox/modules/try.lua:117]: in function 'try'
[@programdir/modules/async/runjobs.lua:431]: in function 'cotask'
[@programdir/core/base/scheduler.lua:539]:
stack traceback:
[C]: in global 'error'
@programdir/core/base/os.lua:1204: in function 'os.raiselevel'
(...tail calls...)
@programdir/core/main.lua:274: in upvalue 'cotask'
@programdir/core/base/scheduler.lua:539: in function <@programdir/core/base/scheduler.lua:532>
Xmake Version
3.1.1
Operating System Version and Architecture
Arch Linux
Describe Bug
Cycling between debug and release modes twice appears to break release mode if using sanitizers on debug. I used LLMs to try to find a root cause and fix but failed. Invalid description below left for posterity. The repro, however, is valid.
Repro:
Expected Behavior
Builds are not spuriously broken when switching modes.
Project Configuration
Additional Information and Error Logs