From f6bf3353b14682dab395f40ae3d2354a0ee64aed Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 16 Nov 2023 10:51:21 +0100 Subject: [PATCH 1/2] elf: test -r mode with archive on the linker line --- test/link/elf.zig | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/link/elf.zig b/test/link/elf.zig index 1c0a1835f0..3c02d61e92 100644 --- a/test/link/elf.zig +++ b/test/link/elf.zig @@ -23,6 +23,7 @@ pub fn testAll(b: *Build) *Step { // Exercise linker in -r mode elf_step.dependOn(testEmitRelocatable(b, .{ .use_llvm = false, .target = musl_target })); elf_step.dependOn(testEmitRelocatable(b, .{ .target = musl_target })); + elf_step.dependOn(testRelocatableArchive(b, .{ .target = musl_target })); elf_step.dependOn(testRelocatableEhFrame(b, .{ .target = musl_target })); // Exercise linker in ar mode @@ -2141,6 +2142,56 @@ fn testPreinitArray(b: *Build, opts: Options) *Step { return test_step; } +fn testRelocatableArchive(b: *Build, opts: Options) *Step { + const test_step = addTestStep(b, "relocatable-archive", opts); + + const obj1 = addObject(b, "obj1", opts); + addCSourceBytes(obj1, + \\void bar(); + \\void foo() { + \\ bar(); + \\} + , &.{}); + + const obj2 = addObject(b, "obj2", opts); + addCSourceBytes(obj2, + \\void bar() {} + , &.{}); + + const obj3 = addObject(b, "obj3", opts); + addCSourceBytes(obj3, + \\void baz(); + , &.{}); + + const obj4 = addObject(b, "obj4", opts); + addCSourceBytes(obj4, + \\void foo(); + \\int main() { + \\ foo(); + \\} + , &.{}); + + const lib = addStaticLibrary(b, "lib", opts); + lib.addObject(obj1); + lib.addObject(obj2); + lib.addObject(obj3); + + const obj5 = addObject(b, "obj5", opts); + obj5.addObject(obj4); + obj5.linkLibrary(lib); + + const check = obj5.checkObject(); + check.checkInSymtab(); + check.checkContains("foo"); + check.checkInSymtab(); + check.checkContains("bar"); + check.checkInSymtab(); + check.checkNotPresent("baz"); + test_step.dependOn(&check.step); + + return test_step; +} + fn testRelocatableEhFrame(b: *Build, opts: Options) *Step { const test_step = addTestStep(b, "relocatable-eh-frame", opts); From 85c0485fd9ccc89dae97a8fed6d503b0e8c9e519 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 16 Nov 2023 10:54:39 +0100 Subject: [PATCH 2/2] elf: test -r mode does not create unneeded .eh_frame section --- test/link/elf.zig | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/link/elf.zig b/test/link/elf.zig index 3c02d61e92..eeff8197af 100644 --- a/test/link/elf.zig +++ b/test/link/elf.zig @@ -25,6 +25,7 @@ pub fn testAll(b: *Build) *Step { elf_step.dependOn(testEmitRelocatable(b, .{ .target = musl_target })); elf_step.dependOn(testRelocatableArchive(b, .{ .target = musl_target })); elf_step.dependOn(testRelocatableEhFrame(b, .{ .target = musl_target })); + elf_step.dependOn(testRelocatableNoEhFrame(b, .{ .target = musl_target })); // Exercise linker in ar mode elf_step.dependOn(testEmitStaticLib(b, .{ .target = musl_target })); @@ -2275,6 +2276,33 @@ fn testRelocatableEhFrame(b: *Build, opts: Options) *Step { return test_step; } +fn testRelocatableNoEhFrame(b: *Build, opts: Options) *Step { + const test_step = addTestStep(b, "relocatable-no-eh-frame", opts); + + const obj1 = addObject(b, "obj1", opts); + addCSourceBytes(obj1, "int bar() { return 42; }", &.{ + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + }); + + const obj2 = addObject(b, "obj2", opts); + obj2.addObject(obj1); + + const check1 = obj1.checkObject(); + check1.checkStart(); + check1.checkExact("section headers"); + check1.checkNotPresent(".eh_frame"); + test_step.dependOn(&check1.step); + + const check2 = obj2.checkObject(); + check2.checkStart(); + check2.checkExact("section headers"); + check2.checkNotPresent(".eh_frame"); + test_step.dependOn(&check2.step); + + return test_step; +} + fn testSharedAbsSymbol(b: *Build, opts: Options) *Step { const test_step = addTestStep(b, "shared-abs-symbol", opts);