From 30f4b05b5f733b57e5e821de9e0ecdc53711a57c Mon Sep 17 00:00:00 2001 From: Matthew Lugg Date: Mon, 25 May 2026 07:25:23 +0100 Subject: [PATCH] Elf2: emit DT_RUNPATH (rpath) --- src/link/Elf2.zig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 92f267513d641c457daadecf7781ef2c45f6a687..68e07062de65f3212b4e6f8eb025f49ae37f02f3 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -3971,8 +3971,18 @@ fn prelinkInner(elf: *Elf) !void { const ElfN = ct_class.ElfN(); const flags: ElfN.Addr = if (elf.options.z_now) std.elf.DF_BIND_NOW else 0; const flags_1: ElfN.Addr = if (elf.options.z_now) std.elf.DF_1_NOW else 0; + const rpath: String(.dynstr) = rpath: { + var buf: std.ArrayList(u8) = .empty; + defer buf.deinit(gpa); + for (elf.options.rpath_list, 0..) |path, i| { + if (i > 0) try buf.append(gpa, ':'); + try buf.appendSlice(gpa, path); + } + break :rpath try elf.string(.dynstr, buf.items); + }; const needed_len = elf.needed.count(); const dynamic_len = needed_len + @intFromBool(elf.options.soname != null) + + @intFromBool(rpath != .empty) + @intFromBool(flags != 0) + @intFromBool(flags_1 != 0) + @as(usize, @intFromBool(elf.shndx.init_array != .UNDEF)) * 2 + @as(usize, @intFromBool(elf.shndx.fini_array != .UNDEF)) * 2 + @@ -3996,6 +4006,10 @@ fn prelinkInner(elf: *Elf) !void { dynamic_entries[dynamic_index] = .{ std.elf.DT_SONAME, @intFromEnum(try elf.string(.dynstr, soname)) }; dynamic_index += 1; } + if (rpath != .empty) { + dynamic_entries[dynamic_index] = .{ std.elf.DT_RUNPATH, @intFromEnum(rpath) }; + dynamic_index += 1; + } if (flags != 0) { dynamic_entries[dynamic_index] = .{ std.elf.DT_FLAGS, flags }; dynamic_index += 1; -- 2.54.0