aboutsummaryrefslogtreecommitdiff
path: root/src/link/Coff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-03-28 21:42:55 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-03-28 21:42:55 +0200
commitcde722a7117b6da129d3c49dabd445136ed5edb5 (patch)
tree5fa9aae95c52832d53d0b2ee3f4a635e28135bf9 /src/link/Coff
parent25f3175217dace219af643bce7bd28913a970362 (diff)
downloadzig-cde722a7117b6da129d3c49dabd445136ed5edb5.tar.gz
zig-cde722a7117b6da129d3c49dabd445136ed5edb5.zip
coff: put section growing in helper; only mark section if actually resolved
Diffstat (limited to 'src/link/Coff')
-rw-r--r--src/link/Coff/ImportTable.zig2
-rw-r--r--src/link/Coff/Relocation.zig8
2 files changed, 7 insertions, 3 deletions
diff --git a/src/link/Coff/ImportTable.zig b/src/link/Coff/ImportTable.zig
index ba58af2fe0..c3ba77e855 100644
--- a/src/link/Coff/ImportTable.zig
+++ b/src/link/Coff/ImportTable.zig
@@ -121,7 +121,7 @@ pub fn fmtDebug(itab: ImportTable, ctx: Context) std.fmt.Formatter(fmt) {
return .{ .data = .{ .itab = itab, .ctx = ctx } };
}
-const ImportIndex = u32;
+pub const ImportIndex = u32;
const ImportTable = @This();
const std = @import("std");
diff --git a/src/link/Coff/Relocation.zig b/src/link/Coff/Relocation.zig
index 4e2f772524..37bd3e292f 100644
--- a/src/link/Coff/Relocation.zig
+++ b/src/link/Coff/Relocation.zig
@@ -72,12 +72,14 @@ pub fn getTargetAddress(self: Relocation, coff_file: *const Coff) ?u32 {
}
}
-pub fn resolve(self: Relocation, atom_index: Atom.Index, code: []u8, coff_file: *Coff) void {
+/// Returns `false` if obtaining the target address has been deferred until `flushModule`.
+/// This can happen when trying to resolve address of an import table entry ahead of time.
+pub fn resolve(self: Relocation, atom_index: Atom.Index, code: []u8, coff_file: *Coff) bool {
const atom = coff_file.getAtom(atom_index);
const source_sym = atom.getSymbol(coff_file);
const source_vaddr = source_sym.value + self.offset;
- const target_vaddr = self.getTargetAddress(coff_file) orelse return;
+ const target_vaddr = self.getTargetAddress(coff_file) orelse return false;
const target_vaddr_with_addend = target_vaddr + self.addend;
log.debug(" ({x}: [() => 0x{x} ({s})) ({s}) ", .{
@@ -100,6 +102,8 @@ pub fn resolve(self: Relocation, atom_index: Atom.Index, code: []u8, coff_file:
.x86, .x86_64 => self.resolveX86(ctx),
else => unreachable, // unhandled target architecture
}
+
+ return true;
}
const Context = struct {