authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-12 20:03:10+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-15 01:30:34+02:00
logc0378e85b62486ed95c3051c732501f6a8fbebb8
tree6b7c81fd89cfca567a88808a8270b4b4bd06939f
parentebb37e719d1c99a1bb14ee84bbabdeab0c61ba63
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

link: Improve handling of --build-id when using LLD.


3 files changed, 27 insertions(+), 20 deletions(-)

src/link/Coff.zig+7
...@@ -1763,6 +1763,7 @@ fn linkWithLLD(coff: *Coff, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:...@@ -1763,6 +1763,7 @@ fn linkWithLLD(coff: *Coff, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:
1763 man.hash.addOptionalBytes(entry_name);1763 man.hash.addOptionalBytes(entry_name);
1764 man.hash.add(coff.base.stack_size);1764 man.hash.add(coff.base.stack_size);
1765 man.hash.add(coff.image_base);1765 man.hash.add(coff.image_base);
1766 man.hash.add(coff.base.build_id);
1766 {1767 {
1767 // TODO remove this, libraries must instead be resolved by the frontend.1768 // TODO remove this, libraries must instead be resolved by the frontend.
1768 for (coff.lib_directories) |lib_directory| man.hash.addOptionalBytes(lib_directory.path);1769 for (coff.lib_directories) |lib_directory| man.hash.addOptionalBytes(lib_directory.path);
...@@ -1895,6 +1896,12 @@ fn linkWithLLD(coff: *Coff, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:...@@ -1895,6 +1896,12 @@ fn linkWithLLD(coff: *Coff, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:
1895 }1896 }
1896 try argv.append(try allocPrint(arena, "-BASE:{d}", .{coff.image_base}));1897 try argv.append(try allocPrint(arena, "-BASE:{d}", .{coff.image_base}));
18971898
1899 switch (coff.base.build_id) {
1900 .none => try argv.append("-BUILD-ID:NO"),
1901 .fast => try argv.append("-BUILD-ID"),
1902 .uuid, .sha1, .md5, .hexstring => {},
1903 }
1904
1898 if (target.cpu.arch == .x86) {1905 if (target.cpu.arch == .x86) {
1899 try argv.append("-MACHINE:X86");1906 try argv.append("-MACHINE:X86");
1900 } else if (target.cpu.arch == .x86_64) {1907 } else if (target.cpu.arch == .x86_64) {
src/link/Elf.zig+9-15
...@@ -1596,8 +1596,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s...@@ -1596,8 +1596,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
1596 man.hash.addListOfBytes(self.rpath_table.keys());1596 man.hash.addListOfBytes(self.rpath_table.keys());
1597 if (output_mode == .Exe) {1597 if (output_mode == .Exe) {
1598 man.hash.add(self.base.stack_size);1598 man.hash.add(self.base.stack_size);
1599 man.hash.add(self.base.build_id);
1600 }1599 }
1600 man.hash.add(self.base.build_id);
1601 man.hash.addListOfBytes(self.symbol_wrap_set.keys());1601 man.hash.addListOfBytes(self.symbol_wrap_set.keys());
1602 man.hash.add(comp.skip_linker_dependencies);1602 man.hash.add(comp.skip_linker_dependencies);
1603 man.hash.add(self.z_nodelete);1603 man.hash.add(self.z_nodelete);
...@@ -1753,20 +1753,14 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s...@@ -1753,20 +1753,14 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
1753 });1753 });
1754 }1754 }
17551755
1756 if (is_exe_or_dyn_lib) {1756 switch (self.base.build_id) {
1757 switch (self.base.build_id) {1757 .none => try argv.append("--build-id=none"),
1758 .none => {},1758 .fast, .uuid, .sha1, .md5 => try argv.append(try std.fmt.allocPrint(arena, "--build-id={s}", .{
1759 .fast, .uuid, .sha1, .md5 => {1759 @tagName(self.base.build_id),
1760 try argv.append(try std.fmt.allocPrint(arena, "--build-id={s}", .{1760 })),
1761 @tagName(self.base.build_id),1761 .hexstring => |hs| try argv.append(try std.fmt.allocPrint(arena, "--build-id=0x{s}", .{
1762 }));1762 std.fmt.fmtSliceHexLower(hs.toSlice()),
1763 },1763 })),
1764 .hexstring => |hs| {
1765 try argv.append(try std.fmt.allocPrint(arena, "--build-id=0x{s}", .{
1766 std.fmt.fmtSliceHexLower(hs.toSlice()),
1767 }));
1768 },
1769 }
1770 }1764 }
17711765
1772 try argv.append(try std.fmt.allocPrint(arena, "--image-base={d}", .{self.image_base}));1766 try argv.append(try std.fmt.allocPrint(arena, "--image-base={d}", .{self.image_base}));
src/link/Wasm.zig+11-5
...@@ -4067,6 +4067,17 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:...@@ -4067,6 +4067,17 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:
4067 try std.fmt.allocPrint(arena, "stack-size={d}", .{wasm.base.stack_size}),4067 try std.fmt.allocPrint(arena, "stack-size={d}", .{wasm.base.stack_size}),
4068 });4068 });
40694069
4070 switch (wasm.base.build_id) {
4071 .none => try argv.append("--build-id=none"),
4072 .fast, .uuid, .sha1 => try argv.append(try std.fmt.allocPrint(arena, "--build-id={s}", .{
4073 @tagName(wasm.base.build_id),
4074 })),
4075 .hexstring => |hs| try argv.append(try std.fmt.allocPrint(arena, "--build-id=0x{s}", .{
4076 std.fmt.fmtSliceHexLower(hs.toSlice()),
4077 })),
4078 .md5 => {},
4079 }
4080
4070 if (wasm.import_symbols) {4081 if (wasm.import_symbols) {
4071 try argv.append("--allow-undefined");4082 try argv.append("--allow-undefined");
4072 }4083 }
...@@ -4078,11 +4089,6 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:...@@ -4078,11 +4089,6 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:
4078 try argv.append("--pie");4089 try argv.append("--pie");
4079 }4090 }
40804091
4081 // XXX - TODO: add when wasm-ld supports --build-id.
4082 // if (wasm.base.build_id) {
4083 // try argv.append("--build-id=tree");
4084 // }
4085
4086 try argv.appendSlice(&.{ "-o", full_out_path });4092 try argv.appendSlice(&.{ "-o", full_out_path });
40874093
4088 if (target.cpu.arch == .wasm64) {4094 if (target.cpu.arch == .wasm64) {