| ... | @@ -17,6 +17,16 @@ pub fn build(b: *Build) void { | ... | @@ -17,6 +17,16 @@ pub fn build(b: *Build) void { |
| 17 | .abi = .gnu, | 17 | .abi = .gnu, |
| 18 | }; | 18 | }; |
| 19 | | 19 | |
| | 20 | var dynamic_linker: ?[]const u8 = null; |
| | 21 | if (std.zig.system.NativeTargetInfo.detect(.{})) |host| blk: { |
| | 22 | if (host.target.cpu.arch != glibc_target.cpu_arch.? or |
| | 23 | host.target.os.tag != glibc_target.os_tag.? or |
| | 24 | host.target.abi != glibc_target.abi.?) break :blk; |
| | 25 | if (host.dynamic_linker.get()) |path| { |
| | 26 | dynamic_linker = b.dupe(path); |
| | 27 | } |
| | 28 | } else |_| {} |
| | 29 | |
| 20 | // Exercise linker with self-hosted backend (no LLVM) | 30 | // Exercise linker with self-hosted backend (no LLVM) |
| 21 | // elf_step.dependOn(testLinkingZig(b, .{ .use_llvm = false })); | 31 | // elf_step.dependOn(testLinkingZig(b, .{ .use_llvm = false })); |
| 22 | | 32 | |
| ... | @@ -30,10 +40,8 @@ pub fn build(b: *Build) void { | ... | @@ -30,10 +40,8 @@ pub fn build(b: *Build) void { |
| 30 | elf_step.dependOn(testLinkingZig(b, .{ .target = musl_target })); | 40 | elf_step.dependOn(testLinkingZig(b, .{ .target = musl_target })); |
| 31 | elf_step.dependOn(testTlsStatic(b, .{ .target = musl_target })); | 41 | elf_step.dependOn(testTlsStatic(b, .{ .target = musl_target })); |
| 32 | | 42 | |
| 33 | for (&[_]CrossTarget{ glibc_target, musl_target }) |target| { | 43 | elf_step.dependOn(testDsoPlt(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| 34 | elf_step.dependOn(testDsoPlt(b, .{ .target = target })); | 44 | elf_step.dependOn(testDsoUndef(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker })); |
| 35 | elf_step.dependOn(testDsoUndef(b, .{ .target = target })); | | |
| 36 | } | | |
| 37 | } | 45 | } |
| 38 | | 46 | |
| 39 | fn testCommonSymbols(b: *Build, opts: Options) *Step { | 47 | fn testCommonSymbols(b: *Build, opts: Options) *Step { |
| ... | @@ -199,7 +207,6 @@ fn testDsoUndef(b: *Build, opts: Options) *Step { | ... | @@ -199,7 +207,6 @@ fn testDsoUndef(b: *Build, opts: Options) *Step { |
| 199 | \\} | 207 | \\} |
| 200 | , &.{}); | 208 | , &.{}); |
| 201 | exe.is_linking_libc = true; | 209 | exe.is_linking_libc = true; |
| 202 | exe.verbose_link = true; | | |
| 203 | | 210 | |
| 204 | const run = addRunArtifact(exe); | 211 | const run = addRunArtifact(exe); |
| 205 | run.expectExitCode(0); | 212 | run.expectExitCode(0); |
| ... | @@ -438,6 +445,7 @@ const Options = struct { | ... | @@ -438,6 +445,7 @@ const Options = struct { |
| 438 | target: CrossTarget = .{ .cpu_arch = .x86_64, .os_tag = .linux }, | 445 | target: CrossTarget = .{ .cpu_arch = .x86_64, .os_tag = .linux }, |
| 439 | optimize: std.builtin.OptimizeMode = .Debug, | 446 | optimize: std.builtin.OptimizeMode = .Debug, |
| 440 | use_llvm: bool = true, | 447 | use_llvm: bool = true, |
| | 448 | dynamic_linker: ?[]const u8 = null, |
| 441 | }; | 449 | }; |
| 442 | | 450 | |
| 443 | fn addTestStep(b: *Build, comptime prefix: []const u8, opts: Options) *Step { | 451 | fn addTestStep(b: *Build, comptime prefix: []const u8, opts: Options) *Step { |
| ... | @@ -453,13 +461,15 @@ fn addTestStep(b: *Build, comptime prefix: []const u8, opts: Options) *Step { | ... | @@ -453,13 +461,15 @@ fn addTestStep(b: *Build, comptime prefix: []const u8, opts: Options) *Step { |
| 453 | } | 461 | } |
| 454 | | 462 | |
| 455 | fn addExecutable(b: *Build, opts: Options) *Compile { | 463 | fn addExecutable(b: *Build, opts: Options) *Compile { |
| 456 | return b.addExecutable(.{ | 464 | const exe = b.addExecutable(.{ |
| 457 | .name = "test", | 465 | .name = "test", |
| 458 | .target = opts.target, | 466 | .target = opts.target, |
| 459 | .optimize = opts.optimize, | 467 | .optimize = opts.optimize, |
| 460 | .use_llvm = opts.use_llvm, | 468 | .use_llvm = opts.use_llvm, |
| 461 | .use_lld = false, | 469 | .use_lld = false, |
| 462 | }); | 470 | }); |
| | 471 | exe.link_dynamic_linker = opts.dynamic_linker; |
| | 472 | return exe; |
| 463 | } | 473 | } |
| 464 | | 474 | |
| 465 | fn addObject(b: *Build, opts: Options) *Compile { | 475 | fn addObject(b: *Build, opts: Options) *Compile { |
| ... | @@ -483,13 +493,15 @@ fn addStaticLibrary(b: *Build, opts: Options) *Compile { | ... | @@ -483,13 +493,15 @@ fn addStaticLibrary(b: *Build, opts: Options) *Compile { |
| 483 | } | 493 | } |
| 484 | | 494 | |
| 485 | fn addSharedLibrary(b: *Build, opts: Options) *Compile { | 495 | fn addSharedLibrary(b: *Build, opts: Options) *Compile { |
| 486 | return b.addSharedLibrary(.{ | 496 | const dso = b.addSharedLibrary(.{ |
| 487 | .name = "a", | 497 | .name = "a", |
| 488 | .target = opts.target, | 498 | .target = opts.target, |
| 489 | .optimize = opts.optimize, | 499 | .optimize = opts.optimize, |
| 490 | .use_llvm = opts.use_llvm, | 500 | .use_llvm = opts.use_llvm, |
| 491 | .use_lld = false, | 501 | .use_lld = false, |
| 492 | }); | 502 | }); |
| | 503 | dso.link_dynamic_linker = opts.dynamic_linker; |
| | 504 | return dso; |
| 493 | } | 505 | } |
| 494 | | 506 | |
| 495 | fn addRunArtifact(comp: *Compile) *Run { | 507 | fn addRunArtifact(comp: *Compile) *Run { |