authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-07 23:45:01+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:33:05+02:00
logf2ad71991a1586c5ec335402c1c6bc424477f98f
treef3f601719a74cc962cd9c0617628a72942cf25fc
parent20980b33e38295aa049d1ae419a74530aa8c62c9

elf: test --export-dynamic flag


1 files changed, 48 insertions(+), 6 deletions(-)

test/link/elf.zig+48-6
......@@ -35,6 +35,7 @@ pub fn build(b: *Build) void {
3535 elf_step.dependOn(testCommonSymbols(b, .{ .target = musl_target }));
3636 elf_step.dependOn(testCommonSymbolsInArchive(b, .{ .target = musl_target }));
3737 elf_step.dependOn(testEmptyObject(b, .{ .target = musl_target }));
38 elf_step.dependOn(testEntryPoint(b, .{ .target = musl_target }));
3839 elf_step.dependOn(testGcSections(b, .{ .target = musl_target }));
3940 elf_step.dependOn(testLinkingC(b, .{ .target = musl_target }));
4041 elf_step.dependOn(testLinkingCpp(b, .{ .target = musl_target }));
......@@ -48,12 +49,9 @@ pub fn build(b: *Build) void {
4849 elf_step.dependOn(testCopyrelAlignment(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
4950 elf_step.dependOn(testDsoPlt(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
5051 elf_step.dependOn(testDsoUndef(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
52 elf_step.dependOn(testExportDynamic(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
5153 elf_step.dependOn(testLargeAlignmentDso(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
52
53 for (&[_]CrossTarget{ musl_target, glibc_target }) |target| {
54 elf_step.dependOn(testEntryPoint(b, .{ .target = target }));
55 elf_step.dependOn(testLargeAlignmentExe(b, .{ .target = target }));
56 }
54 elf_step.dependOn(testLargeAlignmentExe(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
5755}
5856
5957fn testAbsSymbols(b: *Build, opts: Options) *Step {
......@@ -592,7 +590,9 @@ fn testEntryPoint(b: *Build, opts: Options) *Step {
592590 }
593591
594592 {
595 // TODO if I rename this to `main` it fails
593 // TODO looks like not assigning a unique name to this executable will
594 // cause an artifact collision taking the cached executable from the above
595 // step instead of generating a new one.
596596 const exe = addExecutable(b, "other", opts);
597597 exe.addObject(a_o);
598598 exe.addObject(b_o);
......@@ -608,6 +608,48 @@ fn testEntryPoint(b: *Build, opts: Options) *Step {
608608 return test_step;
609609}
610610
611fn testExportDynamic(b: *Build, opts: Options) *Step {
612 const test_step = addTestStep(b, "export-dynamic", opts);
613
614 const obj = addObject(b, "obj", opts);
615 addAsmSourceBytes(obj,
616 \\.text
617 \\ .globl foo
618 \\ .hidden foo
619 \\foo:
620 \\ nop
621 \\ .globl bar
622 \\bar:
623 \\ nop
624 \\ .globl _start
625 \\_start:
626 \\ nop
627 );
628
629 const dso = addSharedLibrary(b, "a", opts);
630 addCSourceBytes(dso, "int baz = 10;", &.{"-fPIC"});
631
632 const exe = addExecutable(b, "main", opts);
633 addCSourceBytes(exe,
634 \\extern int baz;
635 \\int callBaz() {
636 \\ return baz;
637 \\}
638 , &.{});
639 exe.addObject(obj);
640 exe.linkLibrary(dso);
641 exe.rdynamic = true;
642
643 const check = exe.checkObject();
644 check.checkInDynamicSymtab();
645 check.checkContains("bar");
646 check.checkInDynamicSymtab();
647 check.checkContains("_start");
648 test_step.dependOn(&check.step);
649
650 return test_step;
651}
652
611653fn testGcSections(b: *Build, opts: Options) *Step {
612654 const test_step = addTestStep(b, "gc-sections", opts);
613655