diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-09-12 15:44:16 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-09-12 15:44:16 +0200 |
| commit | c654f3b0ee8d02d809bb458e1e006b4aa7c3cbc6 (patch) | |
| tree | 841df34409500529095b45be843bd0332c99aab0 /src/link/Elf/Object.zig | |
| parent | b478a0dd1ab6acab92e2b1a4198fdf6428caad8d (diff) | |
| download | zig-c654f3b0ee8d02d809bb458e1e006b4aa7c3cbc6.tar.gz zig-c654f3b0ee8d02d809bb458e1e006b4aa7c3cbc6.zip | |
elf: claim unresolved dangling symbols that can be claimed
Diffstat (limited to 'src/link/Elf/Object.zig')
| -rw-r--r-- | src/link/Elf/Object.zig | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig index 7d85509901..e99f7c63f8 100644 --- a/src/link/Elf/Object.zig +++ b/src/link/Elf/Object.zig @@ -411,6 +411,34 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) void { } } +pub fn claimUnresolved(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[esym_index]; + if (esym.st_shndx != elf.SHN_UNDEF) continue; + + const global = elf_file.symbol(index); + if (global.file(elf_file)) |_| { + if (global.elfSym(elf_file).st_shndx != elf.SHN_UNDEF) continue; + } + + const is_import = blk: { + if (!elf_file.isDynLib()) break :blk false; + const vis = @as(elf.STV, @enumFromInt(esym.st_other)); + if (vis == .HIDDEN) break :blk false; + break :blk true; + }; + + global.value = 0; + global.atom_index = 0; + global.esym_index = esym_index; + global.file_index = self.index; + global.version_index = if (is_import) elf.VER_NDX_LOCAL else elf_file.default_sym_version; + global.flags.import = is_import; + } +} + pub fn resetGlobals(self: *Object, elf_file: *Elf) void { for (self.globals()) |index| { const global = elf_file.symbol(index); @@ -576,12 +604,12 @@ pub fn writeSymtab(self: *Object, elf_file: *Elf, ctx: anytype) void { } } -pub fn locals(self: *Object) []const u32 { +pub fn locals(self: *Object) []const Symbol.Index { const end = self.first_global orelse self.symbols.items.len; return self.symbols.items[0..end]; } -pub fn globals(self: *Object) []const u32 { +pub fn globals(self: *Object) []const Symbol.Index { const start = self.first_global orelse self.symbols.items.len; return self.symbols.items[start..]; } |
