authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-05 01:55:35-04:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-23 00:26:55-04:00
log9325187fd212d73d39f6189241e12084a58e571b
tree8772970d68c98b72c80577a4005d6263fe25b1db
parenta2f4459da80937e8ca2a19d6298c90690f7ddfcd

Coff: fix aliasGlobal

- Fixup aliasGlobal not properly linking up the relocs lists

1 files changed, 24 insertions(+), 19 deletions(-)

src/link/Coff.zig+24-19
......@@ -1032,7 +1032,7 @@ pub const Symbol = struct {
10321032 const sym = si.get(coff);
10331033 sym.rva = coff.computeNodeRva(sym.ni) + sym.nodeOffset(coff);
10341034 si.applyLocationRelocs(coff);
1035 si.applyTargetRelocs(coff);
1035 si.applyTargetRelocs(coff, .none);
10361036 }
10371037
10381038 pub fn flushSymbolTableIndex(si: Symbol.Index, coff: *Coff) void {
......@@ -1065,7 +1065,7 @@ pub const Symbol = struct {
10651065 }
10661066 }
10671067
1068 pub fn applyTargetRelocs(si: Symbol.Index, coff: *Coff) void {
1068 pub fn applyTargetRelocs(si: Symbol.Index, coff: *Coff, end: Reloc.Index) void {
10691069 const sym = si.get(coff);
10701070
10711071 // TODO: Would this be better modeled using an actual reloc? Would need a si for the header
......@@ -1075,7 +1075,7 @@ pub const Symbol = struct {
10751075 }
10761076
10771077 var ri = sym.target_relocs;
1078 while (ri != .none) {
1078 while (ri != end) {
10791079 const reloc = ri.get(coff);
10801080 assert(reloc.target == si);
10811081 reloc.apply(coff);
......@@ -3403,7 +3403,7 @@ pub fn addReloc(
34033403 const target = target_si.get(coff);
34043404
34053405 const ri: Reloc.Index = @enumFromInt(coff.relocs.items.len);
3406 log.debug("addReloc({d}@{d}+{d} -> {d}@{d}+{d}{s}) = {d}", .{
3406 log.debug("addReloc({d}@{d}+0x{x} -> {d}@{d}+0x{x}{s}) = {d}", .{
34073407 loc_si,
34083408 loc_si.get(coff).section_number,
34093409 offset,
......@@ -4306,15 +4306,15 @@ fn loadObject(
43064306 else => {},
43074307 }
43084308
4309 defer log.debug("addInputSymbol({s}, 0x{x}, {t}=0x{x}, {d}) = n{d} {d}@{d}", .{
4309 defer log.debug("addInputSymbol({s}, 0x{x}@{d}, {t}=0x{x}) = n{d} {d}@{d}", .{
43104310 symbol.name.toSlice(coff),
43114311 index,
4312 symbol.section_number,
43124313 symbol.value,
43134314 switch (symbol.value) {
43144315 .weak_external_aux => unreachable,
43154316 inline else => |v| v,
43164317 },
4317 symbol.section_number,
43184318 symbol.si.get(coff).ni,
43194319 symbol.si,
43204320 symbol.si.get(coff).section_number,
......@@ -5799,10 +5799,18 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v
57995799 const gn = gmi.globalName(coff);
58005800 const si = gmi.symbol(coff);
58015801 const sym = si.get(coff);
5802 const alias_sym = alias_si.get(coff);
58025803 assert(sym.section_number == .UNDEFINED);
58035804 assert(sym.loc_relocs == .none);
58045805
5805 const alias_sym = alias_si.get(coff);
5806 log.debug("aliasGlobal({s}, {?s}) {d}->{d} ({?s})", .{
5807 gn.name.toSlice(coff),
5808 gn.lib_name.toSlice(coff),
5809 si,
5810 alias_si,
5811 if (alias_sym.gmi != .none) alias_sym.gmi.globalName(coff).name.toSlice(coff) else null,
5812 });
5813
58065814 var ri = sym.target_relocs;
58075815 while (ri != .none) {
58085816 const reloc = ri.get(coff);
......@@ -5812,22 +5820,19 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v
58125820 reloc.next = alias_sym.target_relocs;
58135821 if (alias_sym.target_relocs != .none)
58145822 alias_sym.target_relocs.get(coff).prev = ri;
5823 break;
58155824 }
58165825 ri = reloc.next;
58175826 }
58185827
5828 const prev_target_relocs = alias_sym.target_relocs;
5829 if (sym.target_relocs != .none)
5830 alias_sym.target_relocs = sym.target_relocs;
58195831 sym.target_relocs = .none;
58205832 sym.gmi = alias_sym.gmi;
58215833 coff.globals.values()[gmi.unwrap().?] = alias_si;
5822 alias_si.applyTargetRelocs(coff);
5823
5824 log.debug("aliasGlobal({s}, {?s}) {d}->{d} ({?s})", .{
5825 gn.name.toSlice(coff),
5826 gn.lib_name.toSlice(coff),
5827 si,
5828 alias_si,
5829 if (alias_sym.gmi != .none) alias_sym.gmi.globalName(coff).name.toSlice(coff) else null,
5830 });
5834 // Only apply the new relocs
5835 alias_si.applyTargetRelocs(coff, prev_target_relocs);
58315836}
58325837
58335838fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {
......@@ -5839,8 +5844,8 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {
58395844 const is_late = gmi.unwrap().? < coff.global_pending_index;
58405845
58415846 log.debug(
5842 "flushGlobal({s}, {?s}, {}) = {d} ({d})",
5843 .{ gn.name.toSlice(coff), gn.lib_name.toSlice(coff), is_late, si, sym.ni },
5847 "flushGlobal({s}, {?s}, {}) = n{d} {d}@{d}",
5848 .{ gn.name.toSlice(coff), gn.lib_name.toSlice(coff), is_late, sym.ni, si, sym.section_number },
58445849 );
58455850
58465851 if (!coff.isImage()) {
......@@ -6759,7 +6764,7 @@ fn updateExportsInner(
67596764 export_sym.rva = exported_sym.rva;
67606765 export_sym.setValue(.{ .size = exported_sym.value.size });
67616766 export_sym.section_number = exported_sym.section_number;
6762 defer export_si.applyTargetRelocs(coff);
6767 defer export_si.applyTargetRelocs(coff, .none);
67636768
67646769 if (coff.isImage()) {
67656770 if (@"export".opts.name.eqlSlice("_tls_used", ip)) {