Skip to content

Broken builds when switching modes with sanitizer flags present #7785

Description

@alion02

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>

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions