| ... | @@ -50,6 +50,7 @@ pub fn build(b: *Build) void { | ... | @@ -50,6 +50,7 @@ pub fn build(b: *Build) void { |
| 50 | elf_step.dependOn(testDsoPlt(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); | 50 | elf_step.dependOn(testDsoPlt(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| 51 | elf_step.dependOn(testDsoUndef(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); | 51 | 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 })); | 52 | elf_step.dependOn(testExportDynamic(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| | 53 | elf_step.dependOn(testExportSymbolsFromExe(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| 53 | elf_step.dependOn(testLargeAlignmentDso(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); | 54 | elf_step.dependOn(testLargeAlignmentDso(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| 54 | elf_step.dependOn(testLargeAlignmentExe(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); | 55 | elf_step.dependOn(testLargeAlignmentExe(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| 55 | } | 56 | } |
| ... | @@ -650,6 +651,44 @@ fn testExportDynamic(b: *Build, opts: Options) *Step { | ... | @@ -650,6 +651,44 @@ fn testExportDynamic(b: *Build, opts: Options) *Step { |
| 650 | return test_step; | 651 | return test_step; |
| 651 | } | 652 | } |
| 652 | | 653 | |
| | 654 | fn testExportSymbolsFromExe(b: *Build, opts: Options) *Step { |
| | 655 | const test_step = addTestStep(b, "export-symbols-from-exe", opts); |
| | 656 | |
| | 657 | const dso = addSharedLibrary(b, "a", opts); |
| | 658 | addCSourceBytes(dso, |
| | 659 | \\void expfn1(); |
| | 660 | \\void expfn2() {} |
| | 661 | \\ |
| | 662 | \\void foo() { |
| | 663 | \\ expfn1(); |
| | 664 | \\} |
| | 665 | , &.{"-fPIC"}); |
| | 666 | |
| | 667 | const exe = addExecutable(b, "main", opts); |
| | 668 | addCSourceBytes(exe, |
| | 669 | \\void expfn1() {} |
| | 670 | \\void expfn2() {} |
| | 671 | \\void foo(); |
| | 672 | \\ |
| | 673 | \\int main() { |
| | 674 | \\ expfn1(); |
| | 675 | \\ expfn2(); |
| | 676 | \\ foo(); |
| | 677 | \\} |
| | 678 | , &.{}); |
| | 679 | exe.linkLibrary(dso); |
| | 680 | exe.linkLibC(); |
| | 681 | |
| | 682 | const check = exe.checkObject(); |
| | 683 | check.checkInDynamicSymtab(); |
| | 684 | check.checkContains("expfn2"); |
| | 685 | check.checkInDynamicSymtab(); |
| | 686 | check.checkContains("expfn1"); |
| | 687 | test_step.dependOn(&check.step); |
| | 688 | |
| | 689 | return test_step; |
| | 690 | } |
| | 691 | |
| 653 | fn testGcSections(b: *Build, opts: Options) *Step { | 692 | fn testGcSections(b: *Build, opts: Options) *Step { |
| 654 | const test_step = addTestStep(b, "gc-sections", opts); | 693 | const test_step = addTestStep(b, "gc-sections", opts); |
| 655 | | 694 | |