Skip to content

compiler_rt missing __gnu_thumb1_case_shi #24558

@haydenridd

Description

@haydenridd

Zig Version

0.14.1

Steps to Reproduce and Observed Behavior

You have application code:

main.c

int gccFunc(int val);
int main(void)
{
    int v = gccFunc(1);
    return 0;
}

And then static library code:

gcc.c -> libgcc.a

int gccFunc(int a)
{
    return a + 10;
}

The static library is compiled into libgcc.a in build.zig, and then manually linked to the executable via linkSystemLibrary():

const std = @import("std");

pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});

    const library_name = "gcc";
    const libgcc_mod = b.createModule(.{
        .target = target,
        .optimize = optimize,
    });
    libgcc_mod.addCSourceFiles(.{
        .files = &.{"lib/gcc.c"},
        .flags = &.{},
    });
    const libgcc_lib = b.addLibrary(.{
        .name = library_name,
        .linkage = .static,
        .root_module = libgcc_mod,
    });
    b.installArtifact(libgcc_lib);

    const exe_mod = b.createModule(.{
        .target = target,
        .optimize = optimize,
        .link_libc = true,
    });
    exe_mod.addCSourceFiles(.{
        .files = &.{"src/main.c"},
        .flags = &.{},
    });
    exe_mod.addLibraryPath(b.path("zig-out/lib"));
    exe_mod.linkSystemLibrary(library_name, .{
        .needed = true,
        .preferred_link_mode = .static,
        .use_pkg_config = .no,
    });

    const exe = b.addExecutable(.{
        .name = "system_lib_bug",
        .root_module = exe_mod,
    });

    exe.step.dependOn(&libgcc_lib.step);
    exe.verbose_link = true;

    b.installArtifact(exe);
}

This will fail with the error:

error: ld.lld: undefined symbol: gccFunc
    note: referenced by main.c:4 (src/main.c:4)
    note:               /home/hayden/Documents/zig/system-lib-bug/.zig-cache/o/a63c1390c1be2c14448d5a0f31a42c21/main.o:(main)

Examining the build-exe call you can see needed-lgcc is added correctly:

/home/hayden/.zvm/0.14.1/zig build-exe /home/hayden/Documents/zig/system-lib-bug/src/main.c -search_paths_first_static -needed-lgcc -ODebug -L /home/hayden/Documents/zig/system-lib-bug/zig-out/lib -Mroot -lc --verbose-link --cache-dir /home/hayden/Documents/zig/system-lib-bug/.zig-cache --global-cache-dir /home/hayden/.cache/zig --name system_lib_bug --zig-lib-dir /home/hayden/.zvm/0.14.1/lib/ --listen=- 

However looking at the linker call, libgcc.a is missing!

ld.lld --error-limit=0 -mllvm -float-abi=hard --entry _start -z stack-size=16777216 --build-id=none --image-base=16777216 --eh-frame-hdr -znow -m elf_x86_64 -o /home/hayden/Documents/zig/system-lib-bug/.zig-cache/o/88b05d7ddc13501e1f580717076f3b01/system_lib_bug /usr/lib/gcc/x86_64-redhat-linux/14/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/14/../../../../lib64/crti.o -rpath /home/hayden/Documents/zig/system-lib-bug/zig-out/lib -L /usr/lib/gcc/x86_64-redhat-linux/14/../../../../lib64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /home/hayden/Documents/zig/system-lib-bug/.zig-cache/o/a63c1390c1be2c14448d5a0f31a42c21/main.o /home/hayden/.cache/zig/o/ee9c7c2323795433f5cfe8074ac46f67/libubsan_rt.a --as-needed -lm -lpthread -lc -ldl -lrt -lutil /home/hayden/.cache/zig/o/198003ee6be6fa4a77cf81686a4c740a/libcompiler_rt.a /usr/lib/gcc/x86_64-redhat-linux/14/../../../../lib64/crtn.o

This seems to be directly related to the name "gcc", when changing the name in build.zig all works as expected:

const library_name = "not_gcc";

Perhaps there is some conflict given this is a standard name for a C standard library file?

Expected Behavior

libgcc.a should be valid to add to an executable using linkSystemLibrary().

Metadata

Metadata

Assignees

No one assigned

    Labels

    arch-arm32-bit ARMcompiler-rtcontributor friendlyThis issue is limited in scope and/or knowledge of Zig internals.enhancementSolving this issue will likely involve adding new logic or components to the codebase.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions