diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-24 17:07:00 +0200 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-10-25 04:27:44 -0400 |
| commit | 0a04bd87bab4842dbf63133952d1d6eee3aa46bc (patch) | |
| tree | 81977bf9bbd1fd74002266f3549771995134163c /src | |
| parent | f30ab46306d7d137ed70bbcb3466c27846833ed3 (diff) | |
| download | zig-0a04bd87bab4842dbf63133952d1d6eee3aa46bc.tar.gz zig-0a04bd87bab4842dbf63133952d1d6eee3aa46bc.zip | |
elf: use std.math.maxInt(u64) as signal that shdr/phdr not allocated yet
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Elf.zig | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 421d6f9573..034c344c19 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -543,7 +543,7 @@ fn detectAllocCollision(self: *Elf, start: u64, size: u64) ?u64 { const shdr_size: u64 = if (small_ptr) @sizeOf(elf.Elf32_Shdr) else @sizeOf(elf.Elf64_Shdr); const tight_size = self.shdrs.items.len * shdr_size; const increased_size = padToIdeal(tight_size); - const test_end = off + increased_size; + const test_end = off +| increased_size; if (end > off and start < test_end) { return test_end; } @@ -552,7 +552,7 @@ fn detectAllocCollision(self: *Elf, start: u64, size: u64) ?u64 { for (self.shdrs.items) |shdr| { if (shdr.sh_type == elf.SHT_NOBITS) continue; const increased_size = padToIdeal(shdr.sh_size); - const test_end = shdr.sh_offset + increased_size; + const test_end = shdr.sh_offset +| increased_size; if (end > shdr.sh_offset and start < test_end) { return test_end; } @@ -561,7 +561,7 @@ fn detectAllocCollision(self: *Elf, start: u64, size: u64) ?u64 { for (self.phdrs.items) |phdr| { if (phdr.p_type != elf.PT_LOAD) continue; const increased_size = padToIdeal(phdr.p_filesz); - const test_end = phdr.p_offset + increased_size; + const test_end = phdr.p_offset +| increased_size; if (end > phdr.p_offset and start < test_end) { return test_end; } @@ -653,6 +653,7 @@ pub fn allocateAllocSection(self: *Elf, opts: AllocateAllocSectionOpts) error{Ou .type = opts.type, .flags = opts.flags, .addralign = opts.alignment, + .offset = std.math.maxInt(u64), }); const shdr = &self.shdrs.items[index]; try self.phdr_to_shdr_table.putNoClobber(gpa, index, opts.phdr_index); @@ -690,6 +691,7 @@ fn allocateNonAllocSection(self: *Elf, opts: AllocateNonAllocSectionOpts) error{ .info = opts.info, .addralign = opts.alignment, .entsize = opts.entsize, + .offset = std.math.maxInt(u64), }); const shdr = &self.shdrs.items[index]; const off = self.findFreeSpace(opts.size, opts.alignment); @@ -3841,6 +3843,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC, .addralign = ptr_size, + .offset = std.math.maxInt(u64), }); if (self.base.options.eh_frame_hdr) { @@ -3849,6 +3852,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC, .addralign = 4, + .offset = std.math.maxInt(u64), }); } } @@ -3859,6 +3863,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC | elf.SHF_WRITE, .addralign = ptr_size, + .offset = std.math.maxInt(u64), }); } @@ -3880,6 +3885,7 @@ fn initSections(self: *Elf) !void { .flags = elf.SHF_ALLOC, .addralign = @alignOf(elf.Elf64_Rela), .entsize = @sizeOf(elf.Elf64_Rela), + .offset = std.math.maxInt(u64), }); } @@ -3889,12 +3895,14 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC | elf.SHF_EXECINSTR, .addralign = 16, + .offset = std.math.maxInt(u64), }); self.got_plt_section_index = try self.addSection(.{ .name = ".got.plt", .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC | elf.SHF_WRITE, .addralign = @alignOf(u64), + .offset = std.math.maxInt(u64), }); self.rela_plt_section_index = try self.addSection(.{ .name = ".rela.plt", @@ -3902,6 +3910,7 @@ fn initSections(self: *Elf) !void { .flags = elf.SHF_ALLOC, .addralign = @alignOf(elf.Elf64_Rela), .entsize = @sizeOf(elf.Elf64_Rela), + .offset = std.math.maxInt(u64), }); } @@ -3911,6 +3920,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC | elf.SHF_EXECINSTR, .addralign = 16, + .offset = std.math.maxInt(u64), }); } @@ -3919,6 +3929,7 @@ fn initSections(self: *Elf) !void { .name = ".copyrel", .type = elf.SHT_NOBITS, .flags = elf.SHF_ALLOC | elf.SHF_WRITE, + .offset = std.math.maxInt(u64), }); } @@ -3937,6 +3948,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_PROGBITS, .flags = elf.SHF_ALLOC, .addralign = 1, + .offset = std.math.maxInt(u64), }); } @@ -3947,6 +3959,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_STRTAB, .entsize = 1, .addralign = 1, + .offset = std.math.maxInt(u64), }); self.dynamic_section_index = try self.addSection(.{ .name = ".dynamic", @@ -3954,6 +3967,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_DYNAMIC, .entsize = @sizeOf(elf.Elf64_Dyn), .addralign = @alignOf(elf.Elf64_Dyn), + .offset = std.math.maxInt(u64), }); self.dynsymtab_section_index = try self.addSection(.{ .name = ".dynsym", @@ -3962,6 +3976,7 @@ fn initSections(self: *Elf) !void { .addralign = @alignOf(elf.Elf64_Sym), .entsize = @sizeOf(elf.Elf64_Sym), .info = 1, + .offset = std.math.maxInt(u64), }); self.hash_section_index = try self.addSection(.{ .name = ".hash", @@ -3969,12 +3984,14 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_HASH, .addralign = 4, .entsize = 4, + .offset = std.math.maxInt(u64), }); self.gnu_hash_section_index = try self.addSection(.{ .name = ".gnu.hash", .flags = elf.SHF_ALLOC, .type = elf.SHT_GNU_HASH, .addralign = 8, + .offset = std.math.maxInt(u64), }); const needs_versions = for (self.dynsym.entries.items) |entry| { @@ -3988,12 +4005,14 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_GNU_VERSYM, .addralign = @alignOf(elf.Elf64_Versym), .entsize = @sizeOf(elf.Elf64_Versym), + .offset = std.math.maxInt(u64), }); self.verneed_section_index = try self.addSection(.{ .name = ".gnu.version_r", .flags = elf.SHF_ALLOC, .type = elf.SHT_GNU_VERNEED, .addralign = @alignOf(elf.Elf64_Verneed), + .offset = std.math.maxInt(u64), }); } } @@ -4004,6 +4023,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_SYMTAB, .addralign = if (small_ptr) @alignOf(elf.Elf32_Sym) else @alignOf(elf.Elf64_Sym), .entsize = if (small_ptr) @sizeOf(elf.Elf32_Sym) else @sizeOf(elf.Elf64_Sym), + .offset = std.math.maxInt(u64), }); } if (self.strtab_section_index == null) { @@ -4012,6 +4032,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_STRTAB, .entsize = 1, .addralign = 1, + .offset = std.math.maxInt(u64), }); } if (self.shstrtab_section_index == null) { @@ -4020,6 +4041,7 @@ fn initSections(self: *Elf) !void { .type = elf.SHT_STRTAB, .entsize = 1, .addralign = 1, + .offset = std.math.maxInt(u64), }); } } @@ -5651,6 +5673,7 @@ pub const AddSectionOpts = struct { info: u32 = 0, addralign: u64 = 0, entsize: u64 = 0, + offset: u64 = 0, }; pub fn addSection(self: *Elf, opts: AddSectionOpts) !u16 { @@ -5662,7 +5685,7 @@ pub fn addSection(self: *Elf, opts: AddSectionOpts) !u16 { .sh_type = opts.type, .sh_flags = opts.flags, .sh_addr = 0, - .sh_offset = 0, + .sh_offset = opts.offset, .sh_size = 0, .sh_link = opts.link, .sh_info = opts.info, |
