authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:56:47+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:56:47+02:00
logd2727b808cf0876a91b78b3d40a776fc60d2bd58
tree5d4d6484072a5f4b02f5d211d1675b274309b64b
parente89155b565885d8fb0aca3d9843fba914f43e7d9

elf: fix 32bit build


5 files changed, 28 insertions(+), 21 deletions(-)

src/link/Elf.zig+11-6
......@@ -4813,7 +4813,7 @@ fn writeAtoms(self: *Elf) !void {
48134813 unreachable;
48144814 } else 0;
48154815 const sh_offset = shdr.sh_offset + base_offset;
4816 const sh_size = shdr.sh_size - base_offset;
4816 const sh_size = math.cast(usize, shdr.sh_size - base_offset) orelse return error.Overflow;
48174817
48184818 const buffer = try gpa.alloc(u8, sh_size);
48194819 defer gpa.free(buffer);
......@@ -4829,12 +4829,14 @@ fn writeAtoms(self: *Elf) !void {
48294829 assert(atom_ptr.flags.alive);
48304830
48314831 const object = atom_ptr.file(self).?.object;
4832 const offset = atom_ptr.value - shdr.sh_addr - base_offset;
4832 const offset = math.cast(usize, atom_ptr.value - shdr.sh_addr - base_offset) orelse
4833 return error.Overflow;
4834 const size = math.cast(usize, atom_ptr.size) orelse return error.Overflow;
48334835
48344836 log.debug("writing atom({d}) at 0x{x}", .{ atom_index, sh_offset + offset });
48354837
48364838 // TODO decompress directly into provided buffer
4837 const out_code = buffer[offset..][0..atom_ptr.size];
4839 const out_code = buffer[offset..][0..size];
48384840 const in_code = try object.codeDecompressAlloc(self, atom_index);
48394841 defer gpa.free(in_code);
48404842 @memcpy(out_code, in_code);
......@@ -4924,7 +4926,8 @@ fn writeSyntheticSections(self: *Elf) !void {
49244926
49254927 if (self.interp_section_index) |shndx| {
49264928 const shdr = self.shdrs.items[shndx];
4927 var buffer = try gpa.alloc(u8, shdr.sh_size);
4929 const sh_size = math.cast(usize, shdr.sh_size) orelse return error.Overflow;
4930 var buffer = try gpa.alloc(u8, sh_size);
49284931 defer gpa.free(buffer);
49294932 const dylinker = self.base.options.dynamic_linker.?;
49304933 @memcpy(buffer[0..dylinker.len], dylinker);
......@@ -4981,7 +4984,8 @@ fn writeSyntheticSections(self: *Elf) !void {
49814984
49824985 if (self.eh_frame_section_index) |shndx| {
49834986 const shdr = self.shdrs.items[shndx];
4984 var buffer = try std.ArrayList(u8).initCapacity(gpa, shdr.sh_size);
4987 const sh_size = math.cast(usize, shdr.sh_size) orelse return error.Overflow;
4988 var buffer = try std.ArrayList(u8).initCapacity(gpa, sh_size);
49854989 defer buffer.deinit();
49864990 try eh_frame.writeEhFrame(self, buffer.writer());
49874991 try self.base.file.?.pwriteAll(buffer.items, shdr.sh_offset);
......@@ -4989,7 +4993,8 @@ fn writeSyntheticSections(self: *Elf) !void {
49894993
49904994 if (self.eh_frame_hdr_section_index) |shndx| {
49914995 const shdr = self.shdrs.items[shndx];
4992 var buffer = try std.ArrayList(u8).initCapacity(gpa, shdr.sh_size);
4996 const sh_size = math.cast(usize, shdr.sh_size) orelse return error.Overflow;
4997 var buffer = try std.ArrayList(u8).initCapacity(gpa, sh_size);
49934998 defer buffer.deinit();
49944999 try eh_frame.writeEhFrameHdr(self, buffer.writer());
49955000 try self.base.file.?.pwriteAll(buffer.items, shdr.sh_offset);
src/link/Elf/Atom.zig+1-1
......@@ -859,7 +859,7 @@ pub fn resolveRelocsAlloc(self: Atom, elf_file: *Elf, code: []u8) !void {
859859 const S_ = @as(i64, @intCast(target.tlsDescAddress(elf_file)));
860860 try cwriter.writeIntLittle(i32, @as(i32, @intCast(S_ + A - P)));
861861 } else {
862 try x86_64.relaxGotPcTlsDesc(code[rel.r_offset - 3 ..]);
862 try x86_64.relaxGotPcTlsDesc(code[r_offset - 3 ..]);
863863 try cwriter.writeIntLittle(i32, @as(i32, @intCast(S - TP)));
864864 }
865865 },
src/link/Elf/Object.zig+2-1
......@@ -592,13 +592,14 @@ pub fn convertCommonSymbols(self: *Object, elf_file: *Elf) !void {
592592 if (is_tls) sh_flags |= elf.SHF_TLS;
593593 const shndx = @as(u16, @intCast(self.shdrs.items.len));
594594 const shdr = try self.shdrs.addOne(gpa);
595 const sh_size = math.cast(usize, this_sym.st_size) orelse return error.Overflow;
595596 shdr.* = .{
596597 .sh_name = try self.strings.insert(gpa, name),
597598 .sh_type = elf.SHT_NOBITS,
598599 .sh_flags = sh_flags,
599600 .sh_addr = 0,
600601 .sh_offset = 0,
601 .sh_size = this_sym.st_size,
602 .sh_size = sh_size,
602603 .sh_link = 0,
603604 .sh_info = 0,
604605 .sh_addralign = alignment,
src/link/Elf/SharedObject.zig+2-1
......@@ -47,11 +47,12 @@ pub fn parse(self: *SharedObject, elf_file: *Elf) !void {
4747 const reader = stream.reader();
4848
4949 self.header = try reader.readStruct(elf.Elf64_Ehdr);
50 const shoff = std.math.cast(usize, self.header.?.e_shoff) orelse return error.Overflow;
5051
5152 var dynsym_index: ?u16 = null;
5253 const shdrs = @as(
5354 [*]align(1) const elf.Elf64_Shdr,
54 @ptrCast(self.data.ptr + self.header.?.e_shoff),
55 @ptrCast(self.data.ptr + shoff),
5556 )[0..self.header.?.e_shnum];
5657 try self.shdrs.ensureTotalCapacityPrecise(gpa, shdrs.len);
5758
src/link/Elf/eh_frame.zig+12-12
......@@ -1,7 +1,7 @@
11pub const Fde = struct {
22 /// Includes 4byte size cell.
3 offset: u64,
4 size: u64,
3 offset: usize,
4 size: usize,
55 cie_index: u32,
66 rel_index: u32 = 0,
77 rel_num: u32 = 0,
......@@ -36,7 +36,7 @@ pub const Fde = struct {
3636 return std.mem.readIntLittle(u32, fde_data[4..8]);
3737 }
3838
39 pub fn calcSize(fde: Fde) u64 {
39 pub fn calcSize(fde: Fde) usize {
4040 return fde.size + 4;
4141 }
4242
......@@ -102,8 +102,8 @@ pub const Fde = struct {
102102
103103pub const Cie = struct {
104104 /// Includes 4byte size cell.
105 offset: u64,
106 size: u64,
105 offset: usize,
106 size: usize,
107107 rel_index: u32 = 0,
108108 rel_num: u32 = 0,
109109 rel_section_index: u32 = 0,
......@@ -127,7 +127,7 @@ pub const Cie = struct {
127127 return contents[cie.offset..][0..cie.calcSize()];
128128 }
129129
130 pub fn calcSize(cie: Cie) u64 {
130 pub fn calcSize(cie: Cie) usize {
131131 return cie.size + 4;
132132 }
133133
......@@ -203,12 +203,12 @@ pub const Cie = struct {
203203
204204pub const Iterator = struct {
205205 data: []const u8,
206 pos: u64 = 0,
206 pos: usize = 0,
207207
208208 pub const Record = struct {
209209 tag: enum { fde, cie },
210 offset: u64,
211 size: u64,
210 offset: usize,
211 size: usize,
212212 };
213213
214214 pub fn next(it: *Iterator) !?Record {
......@@ -233,7 +233,7 @@ pub const Iterator = struct {
233233};
234234
235235pub fn calcEhFrameSize(elf_file: *Elf) !usize {
236 var offset: u64 = 0;
236 var offset: usize = 0;
237237
238238 var cies = std.ArrayList(Cie).init(elf_file.base.allocator);
239239 defer cies.deinit();
......@@ -283,7 +283,7 @@ pub fn calcEhFrameHdrSize(elf_file: *Elf) usize {
283283}
284284
285285fn resolveReloc(rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela, elf_file: *Elf, contents: []u8) !void {
286 const offset = rel.r_offset - rec.offset;
286 const offset = std.math.cast(usize, rel.r_offset - rec.offset) orelse return error.Overflow;
287287 const P = @as(i64, @intCast(rec.address(elf_file) + offset));
288288 const S = @as(i64, @intCast(sym.address(.{}, elf_file)));
289289 const A = rel.r_addend;
......@@ -414,7 +414,7 @@ pub fn writeEhFrameHdr(elf_file: *Elf, writer: anytype) !void {
414414 try writer.writeAll(std.mem.sliceAsBytes(entries.items));
415415}
416416
417const eh_frame_hdr_header_size: u64 = 12;
417const eh_frame_hdr_header_size: usize = 12;
418418
419419const EH_PE = struct {
420420 pub const absptr = 0x00;