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-13 01:46:15+02:00
log6eabdc8972ebe47d9cc71d6d07034096905cd2d5
treedeb4418f00a660a76d934b63a9a9ddf523dcd1ee
parentd5ac3be6089b24492c209340bc508a5081cc2483

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
...@@ -4078,6 +4078,17 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:...@@ -4078,6 +4078,17 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:
4078 try std.fmt.allocPrint(arena, "stack-size={d}", .{wasm.base.stack_size}),4078 try std.fmt.allocPrint(arena, "stack-size={d}", .{wasm.base.stack_size}),
4079 });4079 });
40804080
4081 switch (wasm.base.build_id) {
4082 .none => try argv.append("--build-id=none"),
4083 .fast, .uuid, .sha1 => try argv.append(try std.fmt.allocPrint(arena, "--build-id={s}", .{
4084 @tagName(wasm.base.build_id),
4085 })),
4086 .hexstring => |hs| try argv.append(try std.fmt.allocPrint(arena, "--build-id=0x{s}", .{
4087 std.fmt.fmtSliceHexLower(hs.toSlice()),
4088 })),
4089 .md5 => {},
4090 }
4091
4081 if (wasm.import_symbols) {4092 if (wasm.import_symbols) {
4082 try argv.append("--allow-undefined");4093 try argv.append("--allow-undefined");
4083 }4094 }
...@@ -4089,11 +4100,6 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:...@@ -4089,11 +4100,6 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, tid: Zcu.PerThread.Id, prog_node:
4089 try argv.append("--pie");4100 try argv.append("--pie");
4090 }4101 }
40914102
4092 // XXX - TODO: add when wasm-ld supports --build-id.
4093 // if (wasm.base.build_id) {
4094 // try argv.append("--build-id=tree");
4095 // }
4096
4097 try argv.appendSlice(&.{ "-o", full_out_path });4103 try argv.appendSlice(&.{ "-o", full_out_path });
40984104
4099 if (target.cpu.arch == .wasm64) {4105 if (target.cpu.arch == .wasm64) {