authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-10-17 17:06:45+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-10-19 18:30:34+01:00
logd070d85471004dfaaf4e865d64e4405116822d2a
tree3172e4ba8dbd4f6543bf70b2849d972b9c2830aa
parent0b4d75a0acd5311edf4f027d77d346bcfdc9b977
signature Commit is signed but in an unrecognized format.

Elf2: simplify relocation application


1 files changed, 54 insertions(+), 132 deletions(-)

src/link/Elf2.zig+54-132
......@@ -1943,28 +1943,20 @@ const SymbolReloc = struct {
19431943 }
19441944 };
19451945
1946 fn flushMovedNode(reloc: *SymbolReloc, elf: *Elf, node_vaddr: u64) void {
1947 if (reloc.rela_index.unwrap()) |rela_index| {
1948 // The node has moved, so the offset of the relocation within the section might have
1949 // changed, so update the `offset` field of the `ElfN.Rela` entry.
1950 reloc.relaSection(elf).relaSetOffset(elf, rela_index, node_vaddr + reloc.offset);
1951 }
1952 // This is not just the inverse of the above condition, because if `reloc` is relative
1953 // to the base of this DSO, then `rela_index` is an `R_*_RELATIVE` relocation, but we
1954 // still need to call `SymbolReloc.apply` to update that relocation's addend.
1955 if (elf.ehdrType() != .REL) {
1956 reloc.apply(elf);
1957 }
1958 }
1959
19601946 fn apply(reloc: *SymbolReloc, elf: *Elf) void {
1961 assert(elf.ehdrType() != .REL);
19621947 const node = reloc.node.unwrap() orelse return; // deleted
19631948 if (node.hasMoved(&elf.mf) or reloc.target.hasMoved(elf)) {
19641949 // There's no point applying the relocation now, because it will be re-applied by
19651950 // `flushMoved` at some point anyway.
19661951 return;
19671952 }
1953 if (elf.ehdrType() == .REL) {
1954 // All we need to do is update the output relocation.
1955 const rela_index = reloc.rela_index.unwrap().?;
1956 const reloc_addr = elf.getNodeVAddr(node) + reloc.offset;
1957 reloc.relaSection(elf).relaSetOffset(elf, rela_index, reloc_addr);
1958 return;
1959 }
19681960 switch (reloc.result) {
19691961 .ok => {},
19701962 .overflowed => elf.overflowed_reloc_count -= 1,
......@@ -2030,7 +2022,11 @@ const SymbolReloc = struct {
20302022 // is required, meaning we can handle it now and return early.
20312023 if (reloc.rela_index.unwrap()) |rela_index| switch (elf.classifySymbolValue(reloc.target)) {
20322024 .static => unreachable,
2033 .dynamic => return, // the relocation happens at runtime
2025 .dynamic => {
2026 // The relocation happens at runtime; we just need to update its offset.
2027 elf.shndx.rela_dyn.relaSetOffset(elf, rela_index, dest_vaddr);
2028 return;
2029 },
20342030 .static_relative => {
20352031 // We have emitted an R_*_RELATIVE relocation to help lower an absolute-address
20362032 // relocation. The value computed above is valid, but instead of writing it to the
......@@ -2042,6 +2038,7 @@ const SymbolReloc = struct {
20422038 }
20432039 assert(reloc.type.action.simple.cast == .unsigned);
20442040 assert(reloc.type.action.simple.shift == .@"0");
2041 elf.shndx.rela_dyn.relaSetOffset(elf, rela_index, dest_vaddr);
20452042 elf.shndx.rela_dyn.relaSetAddend(elf, rela_index, target_val);
20462043 return;
20472044 },
......@@ -2122,34 +2119,14 @@ const NodeReloc = struct {
21222119 }
21232120 };
21242121
2125 fn flushMovedNode(reloc: *NodeReloc, elf: *Elf, node_vaddr: u64) void {
2126 if (reloc.rela_index.unwrap()) |rela_index| {
2127 assert(elf.ehdrType() == .REL);
2128 // The node has moved, so the offset of the relocation within the section might have
2129 // changed, so update the `offset` field of the `ElfN.Rela` entry.
2130 elf.getNodeShndx(reloc.node.unwrap().?).get(elf).rela.shndx.relaSetOffset(elf, rela_index, node_vaddr + reloc.offset);
2131 } else {
2132 assert(elf.ehdrType() != .REL);
2133 reloc.apply(elf);
2134 }
2135 }
2136
2137 fn flushMovedTarget(reloc: *NodeReloc, elf: *Elf, target_section_offset: u64) void {
2138 if (reloc.rela_index.unwrap()) |rela_index| {
2139 assert(elf.ehdrType() == .REL);
2140 // The target has moved, so the `addend` field of the `ElfN.Rela` entry needs to be updated.
2141 elf.getNodeShndx(reloc.node.unwrap().?).get(elf).rela.shndx.relaSetAddend(elf, rela_index, target_section_offset +% @as(u64, @bitCast(reloc.addend)));
2142 } else {
2143 assert(elf.ehdrType() != .REL);
2144 reloc.apply(elf);
2145 }
2146 }
2147
21482122 fn apply(reloc: *NodeReloc, elf: *Elf) void {
21492123 const node = reloc.node.unwrap() orelse return; // deleted
21502124 if (reloc.rela_index.unwrap()) |rela_index| {
21512125 assert(elf.ehdrType() == .REL);
2152 _ = rela_index;
2126 // Ensure the output relocation is up-to-date.
2127 const rela_shndx = elf.getNodeShndx(reloc.node.unwrap().?).get(elf).rela.shndx;
2128 rela_shndx.relaSetOffset(elf, rela_index, elf.getNodeVAddr(node) + reloc.offset);
2129 rela_shndx.relaSetAddend(elf, rela_index, elf.getNodeVAddr(node) +% @as(u64, @bitCast(reloc.addend)));
21532130 } else {
21542131 assert(elf.ehdrType() != .REL);
21552132 if (node.hasMoved(&elf.mf) or reloc.target.hasMoved(&elf.mf)) {
......@@ -4308,14 +4285,12 @@ const Symbol = struct {
43084285 }
43094286
43104287 fn applyTargetRelocs(sym_id: Symbol.Id, elf: *Elf) void {
4311 if (elf.ehdrType() != .REL) {
4312 var ri = sym_id.index(elf).ptr(elf).first_target_reloc;
4313 while (ri != .none) {
4314 const reloc = ri.get(elf);
4315 assert(reloc.target == sym_id);
4316 reloc.apply(elf);
4317 ri = reloc.next;
4318 }
4288 var ri = sym_id.index(elf).ptr(elf).first_target_reloc;
4289 while (ri != .none) {
4290 const reloc = ri.get(elf);
4291 assert(reloc.target == sym_id);
4292 reloc.apply(elf);
4293 ri = reloc.next;
43194294 }
43204295
43214296 if (elf.got.getIndex(.{ .symbol = sym_id })) |got_index| {
......@@ -6623,43 +6598,6 @@ fn computeNodeVAddr(elf: *Elf, ni: MappedFile.Node.Index) u64 {
66236598 const offset, _ = ni.location(&elf.mf).resolve(&elf.mf);
66246599 return parent_vaddr + offset;
66256600}
6626fn computeNodeSectionOffset(elf: *Elf, ni: MappedFile.Node.Index) u64 {
6627 const parent_ni = ni.parent(&elf.mf).unwrap().?;
6628 const parent_section_offset = parent_section_offset: switch (elf.getNode(parent_ni)) {
6629 .deleted,
6630 .archive,
6631 .archive_header,
6632 .archive_input_member,
6633 .archive_elf_member_header,
6634 .elf,
6635 .ehdr,
6636 .shdr,
6637 .segment,
6638 => unreachable,
6639 .section, .section_manual_size => 0,
6640 .input_section, .copied_global => unreachable,
6641 .nav, .uav, .lazy_code, .lazy_const_data => unreachable,
6642 .debug_shared, .debug_addr, .eh_frame_footer, .debug_str_offsets, .unit_padding => unreachable,
6643 .unit_frame, .unit_debug_info, .unit_debug_line => {
6644 const parent_section_offset, _ = parent_ni.location(&elf.mf).resolve(&elf.mf);
6645 break :parent_section_offset parent_section_offset;
6646 },
6647 .unit_frame_cie,
6648 .unit_debug_info_header,
6649 .unit_debug_info_footer,
6650 .unit_debug_line_header,
6651 .unit_debug_rnglists,
6652 .const_debug_info,
6653 .global_debug_info,
6654 .func_frame_fde,
6655 .func_debug_info,
6656 .func_debug_line,
6657 .decl_debug_info,
6658 => unreachable,
6659 };
6660 const offset, _ = ni.location(&elf.mf).resolve(&elf.mf);
6661 return parent_section_offset + offset;
6662}
66636601fn computeNodeElfOffset(elf: *Elf, ni: MappedFile.Node.Index) u64 {
66646602 return ni.fileLocation(&elf.mf, false).offset - elf.ni.elf.fileLocation(&elf.mf, false).offset;
66656603}
......@@ -6801,7 +6739,6 @@ pub fn resetNodeRelocs(elf: *Elf, ni: MappedFile.Node.Index) void {
68016739fn flushMovedNodeRelocs(
68026740 elf: *Elf,
68036741 node: MappedFile.Node.Index,
6804 node_vaddr: u64,
68056742 opts: struct {
68066743 first_symbol_reloc: SymbolReloc.Index = .none,
68076744 skip_symbol_relocs: MappedFile.Node.Index.Optional = .none,
......@@ -6817,7 +6754,7 @@ fn flushMovedNodeRelocs(
68176754 if (reloc.node == opts.skip_symbol_relocs) continue;
68186755 break;
68196756 }
6820 reloc.flushMovedNode(elf, node_vaddr);
6757 reloc.apply(elf);
68216758 }
68226759 }
68236760
......@@ -6828,7 +6765,7 @@ fn flushMovedNodeRelocs(
68286765 if (reloc.node == opts.skip_node_relocs) continue;
68296766 break;
68306767 }
6831 reloc.flushMovedNode(elf, node_vaddr);
6768 reloc.apply(elf);
68326769 }
68336770 }
68346771
......@@ -9406,6 +9343,7 @@ fn addRelocAssumeCapacity(
94069343 .rela_index = rela_index.toOptional(),
94079344 .result = .ok,
94089345 });
9346 ri.get(elf).apply(elf);
94099347 },
94109348 .DYN, .EXEC => switch (elf.ehdrMachine()) {
94119349 .AARCH64 => switch (@"type".AARCH64) {
......@@ -11053,11 +10991,10 @@ pub fn idle(elf: *Elf) link.Error!bool {
1105310991 const idle_prog_node = elf.mf.update_prog_node.start(@tagName(Node.debug_addr), 0);
1105410992 defer idle_prog_node.end();
1105510993 const debug_addr_ni = elf.dwarf.debug_addr.ni.unwrap().?;
11056 const debug_addr_vaddr = elf.getNodeVAddr(debug_addr_ni);
1105710994 for (elf.dwarf_addr.symbol_relocs.items[elf.dwarf_addr.pending_reloc_index..]) |symbol_ri| {
1105810995 const symbol_reloc = symbol_ri.get(elf);
1105910996 assert(symbol_reloc.node.unwrap().? == debug_addr_ni);
11060 symbol_reloc.flushMovedNode(elf, debug_addr_vaddr);
10997 symbol_reloc.apply(elf);
1106110998 }
1106210999 elf.dwarf_addr.pending_reloc_index = elf.dwarf_addr.symbol_relocs.items.len;
1106311000 break :task;
......@@ -11066,11 +11003,10 @@ pub fn idle(elf: *Elf) link.Error!bool {
1106611003 const idle_prog_node = elf.mf.update_prog_node.start(@tagName(Node.debug_str_offsets), 0);
1106711004 defer idle_prog_node.end();
1106811005 const debug_str_offsets_ni = elf.dwarf.debug_str_offsets.ni.unwrap().?;
11069 const debug_str_offsets_vaddr = elf.getNodeVAddr(debug_str_offsets_ni);
1107011006 for (elf.dwarf_str_offsets.node_relocs.items[elf.dwarf_str_offsets.pending_reloc_index..]) |node_ri| {
1107111007 const node_reloc = node_ri.get(elf);
1107211008 assert(node_reloc.node.unwrap().? == debug_str_offsets_ni);
11073 node_reloc.flushMovedNode(elf, debug_str_offsets_vaddr);
11009 node_reloc.apply(elf);
1107411010 }
1107511011 elf.dwarf_str_offsets.pending_reloc_index = elf.dwarf_str_offsets.node_relocs.items.len;
1107611012 break :task;
......@@ -11565,7 +11501,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1156511501 reloc.apply(elf);
1156611502 }
1156711503 } else if (shndx == elf.shndx.plt) {
11568 elf.flushMovedNodeRelocs(ni, addr, .{
11504 elf.flushMovedNodeRelocs(ni, .{
1156911505 .first_symbol_reloc = elf.plt_first_symbol_reloc,
1157011506 });
1157111507 elf.flushMovedPltSection(.plt, old_addr, addr);
......@@ -11574,7 +11510,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1157411510 } else if (shndx == elf.shndx.plt_sec) {
1157511511 elf.flushMovedPltSection(.plt_sec, old_addr, addr);
1157611512 } else if (shndx == elf.shndx.eh_frame_hdr) {
11577 elf.flushMovedNodeRelocs(ni, addr, .{
11513 elf.flushMovedNodeRelocs(ni, .{
1157811514 .first_symbol_reloc = elf.eh_frame_hdr_first_symbol_reloc,
1157911515 });
1158011516 }
......@@ -11627,7 +11563,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1162711563 }
1162811564 }
1162911565
11630 elf.flushMovedNodeRelocs(ni, new_section_addr, .{
11566 elf.flushMovedNodeRelocs(ni, .{
1163111567 .first_symbol_reloc = isi.ptrConst(elf).first_symbol_reloc,
1163211568 .first_got_reloc = isi.ptrConst(elf).first_got_reloc,
1163311569 });
......@@ -11650,7 +11586,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1165011586 Symbol.Id.global(gsi).flushMoved(elf, new_addr);
1165111587 }
1165211588 }
11653 elf.flushMovedNodeRelocs(ni, new_addr, .{
11589 elf.flushMovedNodeRelocs(ni, .{
1165411590 .first_symbol_reloc = mi.firstSymbolReloc(elf),
1165511591 .skip_symbol_relocs = switch (tag) {
1165611592 else => comptime unreachable,
......@@ -11664,12 +11600,11 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1166411600 });
1166511601 },
1166611602 .debug_shared => |ss| {
11667 const target_section_offset = elf.computeNodeSectionOffset(ni);
1166811603 var target_ri = elf.dwarf_shared.getPtr(ss).first_target_reloc;
1166911604 while (target_ri != .none) {
1167011605 const target_reloc = target_ri.get(elf);
1167111606 assert(target_reloc.target == ni);
11672 target_reloc.flushMovedTarget(elf, target_section_offset);
11607 target_reloc.apply(elf);
1167311608 target_ri = target_reloc.next;
1167411609 }
1167511610 },
......@@ -11680,121 +11615,110 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1168011615 .unit_debug_line,
1168111616 => {},
1168211617 .debug_addr => {
11683 const target_section_offset = elf.computeNodeSectionOffset(ni);
1168411618 var target_ri = elf.dwarf_addr.first_target_reloc;
1168511619 while (target_ri != .none) {
1168611620 const target_reloc = target_ri.get(elf);
1168711621 assert(target_reloc.target == ni);
11688 target_reloc.flushMovedTarget(elf, target_section_offset);
11622 target_reloc.apply(elf);
1168911623 target_ri = target_reloc.next;
1169011624 }
11691 const node_vaddr = elf.computeNodeVAddr(ni);
1169211625 for (elf.dwarf_addr.symbol_relocs.items) |symbol_ri| {
1169311626 const symbol_reloc = symbol_ri.get(elf);
1169411627 assert(symbol_reloc.node.unwrap().? == ni);
11695 symbol_reloc.flushMovedNode(elf, node_vaddr);
11628 symbol_reloc.apply(elf);
1169611629 }
1169711630 elf.dwarf_addr.pending_reloc_index = elf.dwarf_addr.symbol_relocs.items.len;
1169811631 },
1169911632 .debug_str_offsets => {
11700 const target_section_offset = elf.computeNodeSectionOffset(ni);
1170111633 var target_ri = elf.dwarf_str_offsets.first_target_reloc;
1170211634 while (target_ri != .none) {
1170311635 const target_reloc = target_ri.get(elf);
1170411636 assert(target_reloc.target == ni);
11705 target_reloc.flushMovedTarget(elf, target_section_offset);
11637 target_reloc.apply(elf);
1170611638 target_ri = target_reloc.next;
1170711639 }
11708 const node_vaddr = elf.computeNodeVAddr(ni);
1170911640 for (elf.dwarf_str_offsets.node_relocs.items) |node_ri| {
1171011641 const node_reloc = node_ri.get(elf);
1171111642 assert(node_reloc.node.unwrap().? == ni);
11712 node_reloc.flushMovedNode(elf, node_vaddr);
11643 node_reloc.apply(elf);
1171311644 }
1171411645 elf.dwarf_str_offsets.pending_reloc_index = elf.dwarf_str_offsets.node_relocs.items.len;
1171511646 },
1171611647 .unit_frame_cie => |ui| {
11717 const target_section_offset = elf.computeNodeSectionOffset(ni);
1171811648 var target_ri = elf.dwarf_units[@backingInt(ui)].frame_cie_first_target_reloc;
1171911649 while (target_ri != .none) {
1172011650 const target_reloc = target_ri.get(elf);
1172111651 assert(target_reloc.target == ni);
11722 target_reloc.flushMovedTarget(elf, target_section_offset);
11652 target_reloc.apply(elf);
1172311653 target_ri = target_reloc.next;
1172411654 }
1172511655 },
1172611656 .unit_debug_info_header => |ui| {
1172711657 const dwarf_unit = &elf.dwarf_units[@backingInt(ui)];
11728 const target_section_offset = elf.computeNodeSectionOffset(ni);
1172911658 var target_ri = dwarf_unit.debug_info_header_first_target_reloc;
1173011659 while (target_ri != .none) {
1173111660 const target_reloc = target_ri.get(elf);
1173211661 assert(target_reloc.target == ni);
11733 target_reloc.flushMovedTarget(elf, target_section_offset);
11662 target_reloc.apply(elf);
1173411663 target_ri = target_reloc.next;
1173511664 }
11736 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11665 elf.flushMovedNodeRelocs(ni, .{
1173711666 .first_node_reloc = dwarf_unit.debug_info_header_first_node_reloc,
1173811667 });
1173911668 },
1174011669 .unit_debug_info_footer => {},
1174111670 .unit_debug_line_header => |ui| {
1174211671 const dwarf_unit = &elf.dwarf_units[@backingInt(ui)];
11743 const target_section_offset = elf.computeNodeSectionOffset(ni);
1174411672 var target_ri = dwarf_unit.debug_line_header_first_target_reloc;
1174511673 while (target_ri != .none) {
1174611674 const target_reloc = target_ri.get(elf);
1174711675 assert(target_reloc.target == ni);
11748 target_reloc.flushMovedTarget(elf, target_section_offset);
11676 target_reloc.apply(elf);
1174911677 target_ri = target_reloc.next;
1175011678 }
11751 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11679 elf.flushMovedNodeRelocs(ni, .{
1175211680 .first_node_reloc = dwarf_unit.debug_line_header_first_node_reloc,
1175311681 });
1175411682 },
1175511683 .unit_debug_rnglists => |ui| {
1175611684 const dwarf_unit = &elf.dwarf_units[@backingInt(ui)];
11757 const target_section_offset = elf.computeNodeSectionOffset(ni);
1175811685 var target_ri = dwarf_unit.debug_rnglists_first_target_reloc;
1175911686 while (target_ri != .none) {
1176011687 const target_reloc = target_ri.get(elf);
1176111688 assert(target_reloc.target == ni);
11762 target_reloc.flushMovedTarget(elf, target_section_offset);
11689 target_reloc.apply(elf);
1176311690 target_ri = target_reloc.next;
1176411691 }
11765 const node_vaddr = elf.computeNodeVAddr(ni);
1176611692 for (dwarf_unit.debug_rnglists_symbol_relocs.items) |symbol_ri| {
1176711693 const symbol_reloc = symbol_ri.get(elf);
1176811694 assert(symbol_reloc.node.unwrap().? == ni);
11769 symbol_reloc.flushMovedNode(elf, node_vaddr);
11695 symbol_reloc.apply(elf);
1177011696 }
1177111697 },
1177211698 .const_debug_info => |cpi| {
1177311699 const dwarf_const = &elf.dwarf_consts.get(cpi).?;
11774 const target_section_offset = elf.computeNodeSectionOffset(ni);
1177511700 var target_ri = dwarf_const.debug_info_first_target_reloc;
1177611701 while (target_ri != .none) {
1177711702 const target_reloc = target_ri.get(elf);
1177811703 assert(target_reloc.target == ni);
11779 target_reloc.flushMovedTarget(elf, target_section_offset);
11704 target_reloc.apply(elf);
1178011705 target_ri = target_reloc.next;
1178111706 }
11782 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11707 elf.flushMovedNodeRelocs(ni, .{
1178311708 .first_symbol_reloc = dwarf_const.debug_info_first_symbol_reloc,
1178411709 .first_node_reloc = dwarf_const.debug_info_first_node_reloc,
1178511710 });
1178611711 },
1178711712 .global_debug_info => |gi| {
1178811713 const dwarf_global = &elf.dwarf_globals.items[@backingInt(gi)];
11789 const target_section_offset = elf.computeNodeSectionOffset(ni);
1179011714 var target_ri = dwarf_global.debug_info_first_target_reloc;
1179111715 while (target_ri != .none) {
1179211716 const target_reloc = target_ri.get(elf);
1179311717 assert(target_reloc.target == ni);
11794 target_reloc.flushMovedTarget(elf, target_section_offset);
11718 target_reloc.apply(elf);
1179511719 target_ri = target_reloc.next;
1179611720 }
11797 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11721 elf.flushMovedNodeRelocs(ni, .{
1179811722 .first_symbol_reloc = dwarf_global.debug_info_first_symbol_reloc,
1179911723 .first_node_reloc = dwarf_global.debug_info_first_node_reloc,
1180011724 });
......@@ -11810,22 +11734,21 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1181011734 elf.dwarf.updateEhFrameFde(ni.slice(&elf.mf), offset);
1181111735 },
1181211736 }
11813 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11737 elf.flushMovedNodeRelocs(ni, .{
1181411738 .first_symbol_reloc = dwarf_func.frame_fde_first_symbol_reloc,
1181511739 .first_node_reloc = dwarf_func.frame_fde_first_node_reloc,
1181611740 });
1181711741 },
1181811742 .func_debug_info => |fi| {
1181911743 const dwarf_func = &elf.dwarf_funcs.items[@backingInt(fi)];
11820 const target_section_offset = elf.computeNodeSectionOffset(ni);
1182111744 var target_ri = dwarf_func.debug_info_first_target_reloc;
1182211745 while (target_ri != .none) {
1182311746 const target_reloc = target_ri.get(elf);
1182411747 assert(target_reloc.target == ni);
11825 target_reloc.flushMovedTarget(elf, target_section_offset);
11748 target_reloc.apply(elf);
1182611749 target_ri = target_reloc.next;
1182711750 }
11828 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11751 elf.flushMovedNodeRelocs(ni, .{
1182911752 .first_symbol_reloc = dwarf_func.debug_info_first_symbol_reloc,
1183011753 .skip_symbol_relocs = if (elf.navs.getPtr(fi.nav(&elf.dwarf))) |nav|
1183111754 nav.lsi.index().ptr(elf).node
......@@ -11837,7 +11760,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1183711760 },
1183811761 .func_debug_line => |fi| {
1183911762 const dwarf_func = &elf.dwarf_funcs.items[@backingInt(fi)];
11840 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11763 elf.flushMovedNodeRelocs(ni, .{
1184111764 .first_symbol_reloc = dwarf_func.debug_line_first_symbol_reloc,
1184211765 .first_node_reloc = dwarf_func.debug_line_first_node_reloc,
1184311766 .skip_node_relocs = fi.get(&elf.dwarf).debug_info_ni,
......@@ -11845,15 +11768,14 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1184511768 },
1184611769 .decl_debug_info => |di| {
1184711770 const dwarf_decl = &elf.dwarf_decls.get(di).?;
11848 const target_section_offset = elf.computeNodeSectionOffset(ni);
1184911771 var target_ri = dwarf_decl.debug_info_first_target_reloc;
1185011772 while (target_ri != .none) {
1185111773 const target_reloc = target_ri.get(elf);
1185211774 assert(target_reloc.target == ni);
11853 target_reloc.flushMovedTarget(elf, target_section_offset);
11775 target_reloc.apply(elf);
1185411776 target_ri = target_reloc.next;
1185511777 }
11856 elf.flushMovedNodeRelocs(ni, elf.computeNodeVAddr(ni), .{
11778 elf.flushMovedNodeRelocs(ni, .{
1185711779 .first_node_reloc = dwarf_decl.debug_info_first_node_reloc,
1185811780 });
1185911781 },