diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-05 07:44:35 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-07 10:21:02 +0200 |
| commit | 137d43c0ea77d5cc21040eadbd38fdfd945a3216 (patch) | |
| tree | d0317c251f8fbd503e8c35d441123200fb16b186 /src/link/Elf/SharedObject.zig | |
| parent | 26da7c8207ff73927bcc8d5608703175074e266f (diff) | |
| download | zig-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.zig | 13 |
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); |
