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