authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-06 16:53:14+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:33:04+02:00
log031e12b963726d47d6e0e0a10e51cfbb73baa0e3
treeb2dbf8b002e9a58a2b65640f1b2247c331173a54
parent62c6c4a46d9af921398de4dd5f93935f0b09c753

elf: override default dynamic linker path with system\`s dl when appropriate


1 files changed, 19 insertions(+), 7 deletions(-)

test/link/elf.zig+19-7
...@@ -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 };
1919
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 }));
2232
...@@ -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 }));
3242
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}
3846
39fn testCommonSymbols(b: *Build, opts: Options) *Step {47fn 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;
203210
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};
442450
443fn addTestStep(b: *Build, comptime prefix: []const u8, opts: Options) *Step {451fn 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}
454462
455fn addExecutable(b: *Build, opts: Options) *Compile {463fn 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}
464474
465fn addObject(b: *Build, opts: Options) *Compile {475fn 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}
484494
485fn addSharedLibrary(b: *Build, opts: Options) *Compile {495fn 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}
494506
495fn addRunArtifact(comp: *Compile) *Run {507fn addRunArtifact(comp: *Compile) *Run {