diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-08 11:51:11 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-08 11:51:11 +0100 |
| commit | ae08f9bfe9c2ab5488b375ffd949609016658450 (patch) | |
| tree | 697a3d39739a2704c538965c6ebcb462f1ea597f /src/link/Elf/Object.zig | |
| parent | e87c751558ec1b81bab09f40959a58d250a35a41 (diff) | |
| download | zig-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.zig | 19 |
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| { |
