aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/Object.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-11-08 11:51:11 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-11-08 11:51:11 +0100
commitae08f9bfe9c2ab5488b375ffd949609016658450 (patch)
tree697a3d39739a2704c538965c6ebcb462f1ea597f /src/link/Elf/Object.zig
parente87c751558ec1b81bab09f40959a58d250a35a41 (diff)
downloadzig-ae08f9bfe9c2ab5488b375ffd949609016658450.tar.gz
zig-ae08f9bfe9c2ab5488b375ffd949609016658450.zip
elf: claim unresolved dangling symbols as undef externs in -r mode
Diffstat (limited to 'src/link/Elf/Object.zig')
-rw-r--r--src/link/Elf/Object.zig19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig
index 8a402ad7d2..0a4232d3b1 100644
--- a/src/link/Elf/Object.zig
+++ b/src/link/Elf/Object.zig
@@ -491,6 +491,25 @@ pub fn claimUnresolved(self: *Object, elf_file: *Elf) void {
}
}
+pub fn claimUnresolvedObject(self: *Object, elf_file: *Elf) void {
+ const first_global = self.first_global orelse return;
+ for (self.globals(), 0..) |index, i| {
+ const esym_index = @as(u32, @intCast(first_global + i));
+ const esym = self.symtab.items[esym_index];
+ if (esym.st_shndx != elf.SHN_UNDEF) continue;
+
+ const global = elf_file.symbol(index);
+ if (global.file(elf_file)) |file| {
+ if (global.elfSym(elf_file).st_shndx != elf.SHN_UNDEF or file.index() <= self.index) continue;
+ }
+
+ global.value = 0;
+ global.atom_index = 0;
+ global.esym_index = esym_index;
+ global.file_index = self.index;
+ }
+}
+
pub fn markLive(self: *Object, elf_file: *Elf) void {
const first_global = self.first_global orelse return;
for (self.globals(), 0..) |index, i| {