diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-16 19:56:47 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-16 19:56:47 +0200 |
| commit | d2727b808cf0876a91b78b3d40a776fc60d2bd58 (patch) | |
| tree | 5d4d6484072a5f4b02f5d211d1675b274309b64b /src | |
| parent | e89155b565885d8fb0aca3d9843fba914f43e7d9 (diff) | |
| download | zig-d2727b808cf0876a91b78b3d40a776fc60d2bd58.tar.gz zig-d2727b808cf0876a91b78b3d40a776fc60d2bd58.zip | |
elf: fix 32bit build
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Elf.zig | 17 | ||||
| -rw-r--r-- | src/link/Elf/Atom.zig | 2 | ||||
| -rw-r--r-- | src/link/Elf/Object.zig | 3 | ||||
| -rw-r--r-- | src/link/Elf/SharedObject.zig | 3 | ||||
| -rw-r--r-- | src/link/Elf/eh_frame.zig | 24 |
5 files changed, 28 insertions, 21 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig index eac19bae82..ebc289a959 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -4813,7 +4813,7 @@ fn writeAtoms(self: *Elf) !void { unreachable; } else 0; const sh_offset = shdr.sh_offset + base_offset; - const sh_size = shdr.sh_size - base_offset; + const sh_size = math.cast(usize, shdr.sh_size - base_offset) orelse return error.Overflow; const buffer = try gpa.alloc(u8, sh_size); defer gpa.free(buffer); @@ -4829,12 +4829,14 @@ fn writeAtoms(self: *Elf) !void { assert(atom_ptr.flags.alive); const object = atom_ptr.file(self).?.object; - const offset = atom_ptr.value - shdr.sh_addr - base_offset; + const offset = math.cast(usize, atom_ptr.value - shdr.sh_addr - base_offset) orelse + return error.Overflow; + const size = math.cast(usize, atom_ptr.size) orelse return error.Overflow; log.debug("writing atom({d}) at 0x{x}", .{ atom_index, sh_offset + offset }); // TODO decompress directly into provided buffer - const out_code = buffer[offset..][0..atom_ptr.size]; + const out_code = buffer[offset..][0..size]; const in_code = try object.codeDecompressAlloc(self, atom_index); defer gpa.free(in_code); @memcpy(out_code, in_code); @@ -4924,7 +4926,8 @@ fn writeSyntheticSections(self: *Elf) !void { if (self.interp_section_index) |shndx| { const shdr = self.shdrs.items[shndx]; - var buffer = try gpa.alloc(u8, shdr.sh_size); + const sh_size = math.cast(usize, shdr.sh_size) orelse return error.Overflow; + var buffer = try gpa.alloc(u8, sh_size); defer gpa.free(buffer); const dylinker = self.base.options.dynamic_linker.?; @memcpy(buffer[0..dylinker.len], dylinker); @@ -4981,7 +4984,8 @@ fn writeSyntheticSections(self: *Elf) !void { if (self.eh_frame_section_index) |shndx| { const shdr = self.shdrs.items[shndx]; - var buffer = try std.ArrayList(u8).initCapacity(gpa, shdr.sh_size); + const sh_size = math.cast(usize, shdr.sh_size) orelse return error.Overflow; + var buffer = try std.ArrayList(u8).initCapacity(gpa, sh_size); defer buffer.deinit(); try eh_frame.writeEhFrame(self, buffer.writer()); try self.base.file.?.pwriteAll(buffer.items, shdr.sh_offset); @@ -4989,7 +4993,8 @@ fn writeSyntheticSections(self: *Elf) !void { if (self.eh_frame_hdr_section_index) |shndx| { const shdr = self.shdrs.items[shndx]; - var buffer = try std.ArrayList(u8).initCapacity(gpa, shdr.sh_size); + const sh_size = math.cast(usize, shdr.sh_size) orelse return error.Overflow; + var buffer = try std.ArrayList(u8).initCapacity(gpa, sh_size); defer buffer.deinit(); try eh_frame.writeEhFrameHdr(self, buffer.writer()); try self.base.file.?.pwriteAll(buffer.items, shdr.sh_offset); diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig index 8cd0827c20..a876a4d16c 100644 --- a/src/link/Elf/Atom.zig +++ b/src/link/Elf/Atom.zig @@ -859,7 +859,7 @@ pub fn resolveRelocsAlloc(self: Atom, elf_file: *Elf, code: []u8) !void { const S_ = @as(i64, @intCast(target.tlsDescAddress(elf_file))); try cwriter.writeIntLittle(i32, @as(i32, @intCast(S_ + A - P))); } else { - try x86_64.relaxGotPcTlsDesc(code[rel.r_offset - 3 ..]); + try x86_64.relaxGotPcTlsDesc(code[r_offset - 3 ..]); try cwriter.writeIntLittle(i32, @as(i32, @intCast(S - TP))); } }, diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig index 173934db86..4edc5b62b1 100644 --- a/src/link/Elf/Object.zig +++ b/src/link/Elf/Object.zig @@ -592,13 +592,14 @@ pub fn convertCommonSymbols(self: *Object, elf_file: *Elf) !void { if (is_tls) sh_flags |= elf.SHF_TLS; const shndx = @as(u16, @intCast(self.shdrs.items.len)); const shdr = try self.shdrs.addOne(gpa); + const sh_size = math.cast(usize, this_sym.st_size) orelse return error.Overflow; shdr.* = .{ .sh_name = try self.strings.insert(gpa, name), .sh_type = elf.SHT_NOBITS, .sh_flags = sh_flags, .sh_addr = 0, .sh_offset = 0, - .sh_size = this_sym.st_size, + .sh_size = sh_size, .sh_link = 0, .sh_info = 0, .sh_addralign = alignment, diff --git a/src/link/Elf/SharedObject.zig b/src/link/Elf/SharedObject.zig index 1bb46c839b..19e688b58d 100644 --- a/src/link/Elf/SharedObject.zig +++ b/src/link/Elf/SharedObject.zig @@ -47,11 +47,12 @@ pub fn parse(self: *SharedObject, elf_file: *Elf) !void { const reader = stream.reader(); self.header = try reader.readStruct(elf.Elf64_Ehdr); + const shoff = std.math.cast(usize, self.header.?.e_shoff) orelse return error.Overflow; var dynsym_index: ?u16 = null; const shdrs = @as( [*]align(1) const elf.Elf64_Shdr, - @ptrCast(self.data.ptr + self.header.?.e_shoff), + @ptrCast(self.data.ptr + shoff), )[0..self.header.?.e_shnum]; try self.shdrs.ensureTotalCapacityPrecise(gpa, shdrs.len); diff --git a/src/link/Elf/eh_frame.zig b/src/link/Elf/eh_frame.zig index 01ca6ccb1a..468f673a9a 100644 --- a/src/link/Elf/eh_frame.zig +++ b/src/link/Elf/eh_frame.zig @@ -1,7 +1,7 @@ pub const Fde = struct { /// Includes 4byte size cell. - offset: u64, - size: u64, + offset: usize, + size: usize, cie_index: u32, rel_index: u32 = 0, rel_num: u32 = 0, @@ -36,7 +36,7 @@ pub const Fde = struct { return std.mem.readIntLittle(u32, fde_data[4..8]); } - pub fn calcSize(fde: Fde) u64 { + pub fn calcSize(fde: Fde) usize { return fde.size + 4; } @@ -102,8 +102,8 @@ pub const Fde = struct { pub const Cie = struct { /// Includes 4byte size cell. - offset: u64, - size: u64, + offset: usize, + size: usize, rel_index: u32 = 0, rel_num: u32 = 0, rel_section_index: u32 = 0, @@ -127,7 +127,7 @@ pub const Cie = struct { return contents[cie.offset..][0..cie.calcSize()]; } - pub fn calcSize(cie: Cie) u64 { + pub fn calcSize(cie: Cie) usize { return cie.size + 4; } @@ -203,12 +203,12 @@ pub const Cie = struct { pub const Iterator = struct { data: []const u8, - pos: u64 = 0, + pos: usize = 0, pub const Record = struct { tag: enum { fde, cie }, - offset: u64, - size: u64, + offset: usize, + size: usize, }; pub fn next(it: *Iterator) !?Record { @@ -233,7 +233,7 @@ pub const Iterator = struct { }; pub fn calcEhFrameSize(elf_file: *Elf) !usize { - var offset: u64 = 0; + var offset: usize = 0; var cies = std.ArrayList(Cie).init(elf_file.base.allocator); defer cies.deinit(); @@ -283,7 +283,7 @@ pub fn calcEhFrameHdrSize(elf_file: *Elf) usize { } fn resolveReloc(rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela, elf_file: *Elf, contents: []u8) !void { - const offset = rel.r_offset - rec.offset; + const offset = std.math.cast(usize, rel.r_offset - rec.offset) orelse return error.Overflow; const P = @as(i64, @intCast(rec.address(elf_file) + offset)); const S = @as(i64, @intCast(sym.address(.{}, elf_file))); const A = rel.r_addend; @@ -414,7 +414,7 @@ pub fn writeEhFrameHdr(elf_file: *Elf, writer: anytype) !void { try writer.writeAll(std.mem.sliceAsBytes(entries.items)); } -const eh_frame_hdr_header_size: u64 = 12; +const eh_frame_hdr_header_size: usize = 12; const EH_PE = struct { pub const absptr = 0x00; |
