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 {
1717 .abi = .gnu,
1818 };
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
2030 // Exercise linker with self-hosted backend (no LLVM)
2131 // elf_step.dependOn(testLinkingZig(b, .{ .use_llvm = false }));
2232
......@@ -30,10 +40,8 @@ pub fn build(b: *Build) void {
3040 elf_step.dependOn(testLinkingZig(b, .{ .target = musl_target }));
3141 elf_step.dependOn(testTlsStatic(b, .{ .target = musl_target }));
3242
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 }));
3745}
3846
3947fn testCommonSymbols(b: *Build, opts: Options) *Step {
......@@ -199,7 +207,6 @@ fn testDsoUndef(b: *Build, opts: Options) *Step {
199207 \\}
200208 , &.{});
201209 exe.is_linking_libc = true;
202 exe.verbose_link = true;
203210
204211 const run = addRunArtifact(exe);
205212 run.expectExitCode(0);
......@@ -438,6 +445,7 @@ const Options = struct {
438445 target: CrossTarget = .{ .cpu_arch = .x86_64, .os_tag = .linux },
439446 optimize: std.builtin.OptimizeMode = .Debug,
440447 use_llvm: bool = true,
448 dynamic_linker: ?[]const u8 = null,
441449};
442450
443451fn 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 {
453461}
454462
455463fn addExecutable(b: *Build, opts: Options) *Compile {
456 return b.addExecutable(.{
464 const exe = b.addExecutable(.{
457465 .name = "test",
458466 .target = opts.target,
459467 .optimize = opts.optimize,
460468 .use_llvm = opts.use_llvm,
461469 .use_lld = false,
462470 });
471 exe.link_dynamic_linker = opts.dynamic_linker;
472 return exe;
463473}
464474
465475fn addObject(b: *Build, opts: Options) *Compile {
......@@ -483,13 +493,15 @@ fn addStaticLibrary(b: *Build, opts: Options) *Compile {
483493}
484494
485495fn addSharedLibrary(b: *Build, opts: Options) *Compile {
486 return b.addSharedLibrary(.{
496 const dso = b.addSharedLibrary(.{
487497 .name = "a",
488498 .target = opts.target,
489499 .optimize = opts.optimize,
490500 .use_llvm = opts.use_llvm,
491501 .use_lld = false,
492502 });
503 dso.link_dynamic_linker = opts.dynamic_linker;
504 return dso;
493505}
494506
495507fn addRunArtifact(comp: *Compile) *Run {