diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-01 08:50:01 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-07 10:21:02 +0200 |
| commit | deeaa1bb0cb8a8c7ccebb23cc68be64e4b013ab2 (patch) | |
| tree | 0b1e93cb77cff05de14485b646e985f7dcba9ecf /src/link/Elf/SharedObject.zig | |
| parent | de80e4fec2a29c5aac70c8d72b11a90cb96feeaf (diff) | |
| download | zig-deeaa1bb0cb8a8c7ccebb23cc68be64e4b013ab2.tar.gz zig-deeaa1bb0cb8a8c7ccebb23cc68be64e4b013ab2.zip | |
elf: redo symbol mgmt and ownership in ZigObject
Diffstat (limited to 'src/link/Elf/SharedObject.zig')
| -rw-r--r-- | src/link/Elf/SharedObject.zig | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/link/Elf/SharedObject.zig b/src/link/Elf/SharedObject.zig index 245805e59e..aff07e4469 100644 --- a/src/link/Elf/SharedObject.zig +++ b/src/link/Elf/SharedObject.zig @@ -282,12 +282,18 @@ pub fn markLive(self: *SharedObject, elf_file: *Elf) void { } } -pub fn globals(self: *SharedObject) []Symbol { - return self.symbols.items; +pub fn markImportExports(self: *SharedObject, elf_file: *Elf) void { + for (0..self.symbols.items.len) |i| { + const ref = self.resolveSymbol(@intCast(i), elf_file); + const ref_sym = elf_file.symbol(ref) orelse continue; + const ref_file = ref_sym.file(self).?; + const vis = @as(elf.STV, @enumFromInt(ref_sym.elfSym(self).st_other)); + if (ref_file != .shared_object and vis != .HIDDEN) ref_sym.flags.@"export" = true; + } } pub fn updateSymtabSize(self: *SharedObject, elf_file: *Elf) void { - for (self.globals(), self.symbols_resolver.items) |*global, resolv| { + for (self.symbols.items, self.symbols_resolver.items) |*global, resolv| { const ref = elf_file.resolver.get(resolv).?; const ref_sym = elf_file.symbol(ref) orelse continue; if (ref_sym.file(elf_file).?.index() != self.index) continue; @@ -300,7 +306,7 @@ pub fn updateSymtabSize(self: *SharedObject, elf_file: *Elf) void { } pub fn writeSymtab(self: *SharedObject, elf_file: *Elf) void { - for (self.globals(), self.symbols_resolver.items) |global, resolv| { + for (self.symbols.items, self.symbols_resolver.items) |global, resolv| { const ref = elf_file.resolver.get(resolv).?; const ref_sym = elf_file.symbol(ref) orelse continue; if (ref_sym.file(elf_file).?.index() != self.index) continue; @@ -354,7 +360,7 @@ pub fn initSymbolAliases(self: *SharedObject, elf_file: *Elf) !void { const gpa = comp.gpa; var aliases = std.ArrayList(Symbol.Index).init(gpa); defer aliases.deinit(); - try aliases.ensureTotalCapacityPrecise(self.globals().len); + try aliases.ensureTotalCapacityPrecise(self.symbols.items.len); for (self.symbols_resolvers.items, 0..) |resolv, index| { const ref = elf_file.resolver.get(resolv).?; |
