aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/SharedObject.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-08-05 07:44:35 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-08-07 10:21:02 +0200
commit137d43c0ea77d5cc21040eadbd38fdfd945a3216 (patch)
treed0317c251f8fbd503e8c35d441123200fb16b186 /src/link/Elf/SharedObject.zig
parent26da7c8207ff73927bcc8d5608703175074e266f (diff)
downloadzig-137d43c0ea77d5cc21040eadbd38fdfd945a3216.tar.gz
zig-137d43c0ea77d5cc21040eadbd38fdfd945a3216.zip
elf: get hello-world glibc working again
Diffstat (limited to 'src/link/Elf/SharedObject.zig')
-rw-r--r--src/link/Elf/SharedObject.zig13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/link/Elf/SharedObject.zig b/src/link/Elf/SharedObject.zig
index c4d84e29c9..b33853d23c 100644
--- a/src/link/Elf/SharedObject.zig
+++ b/src/link/Elf/SharedObject.zig
@@ -219,9 +219,7 @@ fn initSymbols(self: *SharedObject, elf_file: *Elf, opts: struct {
self.versionString(self.versyms.items[i]),
});
defer gpa.free(mangled);
- const name_off = @as(u32, @intCast(self.strtab.items.len));
- try self.strtab.writer(gpa).print("{s}\x00", .{mangled});
- break :blk name_off;
+ break :blk try self.addString(gpa, mangled);
} else sym.st_name;
const out_esym_index: u32 = @intCast(self.symtab.items.len);
const out_esym = self.symtab.addOneAssumeCapacity();
@@ -230,6 +228,7 @@ fn initSymbols(self: *SharedObject, elf_file: *Elf, opts: struct {
const out_sym_index = self.addSymbolAssumeCapacity();
const out_sym = &self.symbols.items[out_sym_index];
out_sym.value = @intCast(out_esym.st_value);
+ out_sym.name_offset = name_off;
out_sym.ref = .{ .index = 0, .file = 0 };
out_sym.esym_index = out_esym_index;
out_sym.version_index = self.versyms.items[out_esym_index];
@@ -394,6 +393,14 @@ pub fn symbolAliases(self: *SharedObject, index: u32, elf_file: *Elf) []const u3
return aliases.items[start..end];
}
+fn addString(self: *SharedObject, allocator: Allocator, str: []const u8) !u32 {
+ const off: u32 = @intCast(self.strtab.items.len);
+ try self.strtab.ensureUnusedCapacity(allocator, str.len + 1);
+ self.strtab.appendSliceAssumeCapacity(str);
+ self.strtab.appendAssumeCapacity(0);
+ return off;
+}
+
pub fn getString(self: SharedObject, off: u32) [:0]const u8 {
assert(off < self.strtab.items.len);
return mem.sliceTo(@as([*:0]const u8, @ptrCast(self.strtab.items.ptr + off)), 0);