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 {...@@ -1032,7 +1032,7 @@ pub const Symbol = struct {
1032 const sym = si.get(coff);1032 const sym = si.get(coff);
1033 sym.rva = coff.computeNodeRva(sym.ni) + sym.nodeOffset(coff);1033 sym.rva = coff.computeNodeRva(sym.ni) + sym.nodeOffset(coff);
1034 si.applyLocationRelocs(coff);1034 si.applyLocationRelocs(coff);
1035 si.applyTargetRelocs(coff);1035 si.applyTargetRelocs(coff, .none);
1036 }1036 }
10371037
1038 pub fn flushSymbolTableIndex(si: Symbol.Index, coff: *Coff) void {1038 pub fn flushSymbolTableIndex(si: Symbol.Index, coff: *Coff) void {
...@@ -1065,7 +1065,7 @@ pub const Symbol = struct {...@@ -1065,7 +1065,7 @@ pub const Symbol = struct {
1065 }1065 }
1066 }1066 }
10671067
1068 pub fn applyTargetRelocs(si: Symbol.Index, coff: *Coff) void {1068 pub fn applyTargetRelocs(si: Symbol.Index, coff: *Coff, end: Reloc.Index) void {
1069 const sym = si.get(coff);1069 const sym = si.get(coff);
10701070
1071 // TODO: Would this be better modeled using an actual reloc? Would need a si for the header1071 // 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 {...@@ -1075,7 +1075,7 @@ pub const Symbol = struct {
1075 }1075 }
10761076
1077 var ri = sym.target_relocs;1077 var ri = sym.target_relocs;
1078 while (ri != .none) {1078 while (ri != end) {
1079 const reloc = ri.get(coff);1079 const reloc = ri.get(coff);
1080 assert(reloc.target == si);1080 assert(reloc.target == si);
1081 reloc.apply(coff);1081 reloc.apply(coff);
...@@ -3403,7 +3403,7 @@ pub fn addReloc(...@@ -3403,7 +3403,7 @@ pub fn addReloc(
3403 const target = target_si.get(coff);3403 const target = target_si.get(coff);
34043404
3405 const ri: Reloc.Index = @enumFromInt(coff.relocs.items.len);3405 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}", .{
3407 loc_si,3407 loc_si,
3408 loc_si.get(coff).section_number,3408 loc_si.get(coff).section_number,
3409 offset,3409 offset,
...@@ -4306,15 +4306,15 @@ fn loadObject(...@@ -4306,15 +4306,15 @@ fn loadObject(
4306 else => {},4306 else => {},
4307 }4307 }
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}", .{
4310 symbol.name.toSlice(coff),4310 symbol.name.toSlice(coff),
4311 index,4311 index,
4312 symbol.section_number,
4312 symbol.value,4313 symbol.value,
4313 switch (symbol.value) {4314 switch (symbol.value) {
4314 .weak_external_aux => unreachable,4315 .weak_external_aux => unreachable,
4315 inline else => |v| v,4316 inline else => |v| v,
4316 },4317 },
4317 symbol.section_number,
4318 symbol.si.get(coff).ni,4318 symbol.si.get(coff).ni,
4319 symbol.si,4319 symbol.si,
4320 symbol.si.get(coff).section_number,4320 symbol.si.get(coff).section_number,
...@@ -5799,10 +5799,18 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v...@@ -5799,10 +5799,18 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v
5799 const gn = gmi.globalName(coff);5799 const gn = gmi.globalName(coff);
5800 const si = gmi.symbol(coff);5800 const si = gmi.symbol(coff);
5801 const sym = si.get(coff);5801 const sym = si.get(coff);
5802 const alias_sym = alias_si.get(coff);
5802 assert(sym.section_number == .UNDEFINED);5803 assert(sym.section_number == .UNDEFINED);
5803 assert(sym.loc_relocs == .none);5804 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
5806 var ri = sym.target_relocs;5814 var ri = sym.target_relocs;
5807 while (ri != .none) {5815 while (ri != .none) {
5808 const reloc = ri.get(coff);5816 const reloc = ri.get(coff);
...@@ -5812,22 +5820,19 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v...@@ -5812,22 +5820,19 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v
5812 reloc.next = alias_sym.target_relocs;5820 reloc.next = alias_sym.target_relocs;
5813 if (alias_sym.target_relocs != .none)5821 if (alias_sym.target_relocs != .none)
5814 alias_sym.target_relocs.get(coff).prev = ri;5822 alias_sym.target_relocs.get(coff).prev = ri;
5823 break;
5815 }5824 }
5816 ri = reloc.next;5825 ri = reloc.next;
5817 }5826 }
58185827
5828 const prev_target_relocs = alias_sym.target_relocs;
5829 if (sym.target_relocs != .none)
5830 alias_sym.target_relocs = sym.target_relocs;
5819 sym.target_relocs = .none;5831 sym.target_relocs = .none;
5820 sym.gmi = alias_sym.gmi;5832 sym.gmi = alias_sym.gmi;
5821 coff.globals.values()[gmi.unwrap().?] = alias_si;5833 coff.globals.values()[gmi.unwrap().?] = alias_si;
5822 alias_si.applyTargetRelocs(coff);5834 // Only apply the new relocs
58235835 alias_si.applyTargetRelocs(coff, prev_target_relocs);
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 });
5831}5836}
58325837
5833fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {5838fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {
...@@ -5839,8 +5844,8 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {...@@ -5839,8 +5844,8 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {
5839 const is_late = gmi.unwrap().? < coff.global_pending_index;5844 const is_late = gmi.unwrap().? < coff.global_pending_index;
58405845
5841 log.debug(5846 log.debug(
5842 "flushGlobal({s}, {?s}, {}) = {d} ({d})",5847 "flushGlobal({s}, {?s}, {}) = n{d} {d}@{d}",
5843 .{ gn.name.toSlice(coff), gn.lib_name.toSlice(coff), is_late, si, sym.ni },5848 .{ gn.name.toSlice(coff), gn.lib_name.toSlice(coff), is_late, sym.ni, si, sym.section_number },
5844 );5849 );
58455850
5846 if (!coff.isImage()) {5851 if (!coff.isImage()) {
...@@ -6759,7 +6764,7 @@ fn updateExportsInner(...@@ -6759,7 +6764,7 @@ fn updateExportsInner(
6759 export_sym.rva = exported_sym.rva;6764 export_sym.rva = exported_sym.rva;
6760 export_sym.setValue(.{ .size = exported_sym.value.size });6765 export_sym.setValue(.{ .size = exported_sym.value.size });
6761 export_sym.section_number = exported_sym.section_number;6766 export_sym.section_number = exported_sym.section_number;
6762 defer export_si.applyTargetRelocs(coff);6767 defer export_si.applyTargetRelocs(coff, .none);
67636768
6764 if (coff.isImage()) {6769 if (coff.isImage()) {
6765 if (@"export".opts.name.eqlSlice("_tls_used", ip)) {6770 if (@"export".opts.name.eqlSlice("_tls_used", ip)) {