diff --git a/test/link/elf.zig b/test/link/elf.zig index 0582338769..b7bf0e9f22 100644 --- a/test/link/elf.zig +++ b/test/link/elf.zig @@ -51,6 +51,7 @@ pub fn build(b: *Build) void { elf_step.dependOn(testLargeAlignmentDso(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); for (&[_]CrossTarget{ musl_target, glibc_target }) |target| { + elf_step.dependOn(testEntryPoint(b, .{ .target = target })); elf_step.dependOn(testLargeAlignmentExe(b, .{ .target = target })); } } @@ -564,6 +565,49 @@ fn testEmptyObject(b: *Build, opts: Options) *Step { return test_step; } +fn testEntryPoint(b: *Build, opts: Options) *Step { + const test_step = addTestStep(b, "entry-point", opts); + + const a_o = addObject(b, "a", opts); + addAsmSourceBytes(a_o, + \\.globl foo, bar + \\foo = 0x1000 + \\bar = 0x2000 + ); + + const b_o = addObject(b, "b", opts); + addCSourceBytes(b_o, "int main() { return 0; }", &.{}); + + { + const exe = addExecutable(b, "main", opts); + exe.addObject(a_o); + exe.addObject(b_o); + exe.entry_symbol_name = "foo"; + + const check = exe.checkObject(); + check.checkStart(); + check.checkExact("header"); + check.checkExact("entry 1000"); + test_step.dependOn(&check.step); + } + + { + // TODO if I rename this to `main` it fails + const exe = addExecutable(b, "other", opts); + exe.addObject(a_o); + exe.addObject(b_o); + exe.entry_symbol_name = "bar"; + + const check = exe.checkObject(); + check.checkStart(); + check.checkExact("header"); + check.checkExact("entry 2000"); + test_step.dependOn(&check.step); + } + + return test_step; +} + fn testGcSections(b: *Build, opts: Options) *Step { const test_step = addTestStep(b, "gc-sections", opts);