authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-09 10:32:39+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-09 10:32:39+01:00
log0de5dd2ef144a5a53c5bdbf1d8e45c1d2becd47b
tree7a311d2b81f12cfd4fa8d0ce076a38707c91b03d
parent0299ed50361fbe3b279f9894119ded14439b7dc4

elf: misc fixes


2 files changed, 2 insertions(+), 32 deletions(-)

src/link/Elf.zig+1-32
...@@ -4483,6 +4483,7 @@ fn allocateAllocSectionsObject(self: *Elf) !void {...@@ -4483,6 +4483,7 @@ fn allocateAllocSectionsObject(self: *Elf) !void {
4483 for (self.shdrs.items) |*shdr| {4483 for (self.shdrs.items) |*shdr| {
4484 if (shdr.sh_type == elf.SHT_NULL) continue;4484 if (shdr.sh_type == elf.SHT_NULL) continue;
4485 if (shdr.sh_flags & elf.SHF_ALLOC == 0) continue;4485 if (shdr.sh_flags & elf.SHF_ALLOC == 0) continue;
4486 if (shdr.sh_type == elf.SHT_NOBITS) continue;
4486 const needed_size = shdr.sh_size;4487 const needed_size = shdr.sh_size;
4487 if (needed_size > self.allocatedSize(shdr.sh_offset)) {4488 if (needed_size > self.allocatedSize(shdr.sh_offset)) {
4488 shdr.sh_size = 0;4489 shdr.sh_size = 0;
...@@ -4833,38 +4834,6 @@ fn updateSymtabSize(self: *Elf) !void {...@@ -4833,38 +4834,6 @@ fn updateSymtabSize(self: *Elf) !void {
4833 strtab.sh_size = strsize + 1;4834 strtab.sh_size = strsize + 1;
4834}4835}
48354836
4836fn updateSymtabSizeZigObject(self: *Elf, zig_object: *ZigObject) void {
4837 var nlocals: u32 = 0;
4838 var nglobals: u32 = 0;
4839 var strsize: u32 = 0;
4840
4841 // Section symbols
4842 for (self.output_sections.keys()) |_| {
4843 nlocals += 1;
4844 }
4845
4846 zig_object.output_symtab_ctx.ilocal = nlocals + 1;
4847 try zig_object.asFile().updateSymtabSize(self);
4848 nlocals += zig_object.output_symtab_ctx.nlocals;
4849 nglobals += zig_object.output_symtab_ctx.nglobals;
4850 strsize += zig_object.output_symtab_ctx.strsize;
4851 zig_object.output_symtab_ctx.iglobal = nlocals + 1;
4852
4853 const symtab_shdr = &self.shdrs.items[self.symtab_section_index.?];
4854 symtab_shdr.sh_info = nlocals + 1;
4855 symtab_shdr.sh_link = self.strtab_section_index.?;
4856
4857 const sym_size: u64 = switch (self.ptr_width) {
4858 .p32 => @sizeOf(elf.Elf32_Sym),
4859 .p64 => @sizeOf(elf.Elf64_Sym),
4860 };
4861 const needed_size = (nlocals + nglobals + 1) * sym_size;
4862 symtab_shdr.sh_size = needed_size;
4863
4864 const strtab = &self.shdrs.items[self.strtab_section_index.?];
4865 strtab.sh_size = strsize + 1;
4866}
4867
4868fn writeSyntheticSections(self: *Elf) !void {4837fn writeSyntheticSections(self: *Elf) !void {
4869 const gpa = self.base.allocator;4838 const gpa = self.base.allocator;
48704839
src/link/Elf/ZigObject.zig+1
...@@ -75,6 +75,7 @@ pub fn init(self: *ZigObject, elf_file: *Elf) !void {...@@ -75,6 +75,7 @@ pub fn init(self: *ZigObject, elf_file: *Elf) !void {
75 const gpa = elf_file.base.allocator;75 const gpa = elf_file.base.allocator;
7676
77 try self.atoms.append(gpa, 0); // null input section77 try self.atoms.append(gpa, 0); // null input section
78 try self.relocs.append(gpa, .{}); // null relocs section
78 try self.strtab.buffer.append(gpa, 0);79 try self.strtab.buffer.append(gpa, 0);
7980
80 const name_off = try self.strtab.insert(gpa, self.path);81 const name_off = try self.strtab.insert(gpa, self.path);