authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-05-25 07:25:23+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-05-26 06:48:53+01:00
log30f4b05b5f733b57e5e821de9e0ecdc53711a57c
tree85d8e47eb3c2eae4580ce2a425868479134cd754
parent15314965c2fc45bf52f703046bff138e414e789c
signaturelock-open Commit is signed but in an unrecognized format.

Elf2: emit DT_RUNPATH (rpath)


1 files changed, 14 insertions(+), 0 deletions(-)

src/link/Elf2.zig+14
......@@ -3971,8 +3971,18 @@ fn prelinkInner(elf: *Elf) !void {
39713971 const ElfN = ct_class.ElfN();
39723972 const flags: ElfN.Addr = if (elf.options.z_now) std.elf.DF_BIND_NOW else 0;
39733973 const flags_1: ElfN.Addr = if (elf.options.z_now) std.elf.DF_1_NOW else 0;
3974 const rpath: String(.dynstr) = rpath: {
3975 var buf: std.ArrayList(u8) = .empty;
3976 defer buf.deinit(gpa);
3977 for (elf.options.rpath_list, 0..) |path, i| {
3978 if (i > 0) try buf.append(gpa, ':');
3979 try buf.appendSlice(gpa, path);
3980 }
3981 break :rpath try elf.string(.dynstr, buf.items);
3982 };
39743983 const needed_len = elf.needed.count();
39753984 const dynamic_len = needed_len + @intFromBool(elf.options.soname != null) +
3985 @intFromBool(rpath != .empty) +
39763986 @intFromBool(flags != 0) + @intFromBool(flags_1 != 0) +
39773987 @as(usize, @intFromBool(elf.shndx.init_array != .UNDEF)) * 2 +
39783988 @as(usize, @intFromBool(elf.shndx.fini_array != .UNDEF)) * 2 +
......@@ -3996,6 +4006,10 @@ fn prelinkInner(elf: *Elf) !void {
39964006 dynamic_entries[dynamic_index] = .{ std.elf.DT_SONAME, @intFromEnum(try elf.string(.dynstr, soname)) };
39974007 dynamic_index += 1;
39984008 }
4009 if (rpath != .empty) {
4010 dynamic_entries[dynamic_index] = .{ std.elf.DT_RUNPATH, @intFromEnum(rpath) };
4011 dynamic_index += 1;
4012 }
39994013 if (flags != 0) {
40004014 dynamic_entries[dynamic_index] = .{ std.elf.DT_FLAGS, flags };
40014015 dynamic_index += 1;