aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/SharedObject.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-08-01 08:50:01 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-08-07 10:21:02 +0200
commitdeeaa1bb0cb8a8c7ccebb23cc68be64e4b013ab2 (patch)
tree0b1e93cb77cff05de14485b646e985f7dcba9ecf /src/link/Elf/SharedObject.zig
parentde80e4fec2a29c5aac70c8d72b11a90cb96feeaf (diff)
downloadzig-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.zig16
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).?;