| ... | ... | @@ -842,42 +842,6 @@ pub fn populateMissingMetadata(self: *Elf) !void { |
| 842 | 842 | } |
| 843 | 843 | } |
| 844 | 844 | |
| 845 | | const shsize: u64 = switch (self.ptr_width) { |
| 846 | | .p32 => @sizeOf(elf.Elf32_Shdr), |
| 847 | | .p64 => @sizeOf(elf.Elf64_Shdr), |
| 848 | | }; |
| 849 | | const shalign: u16 = switch (self.ptr_width) { |
| 850 | | .p32 => @alignOf(elf.Elf32_Shdr), |
| 851 | | .p64 => @alignOf(elf.Elf64_Shdr), |
| 852 | | }; |
| 853 | | if (self.shdr_table_offset == null) { |
| 854 | | self.shdr_table_offset = self.findFreeSpace(self.shdrs.items.len * shsize, shalign); |
| 855 | | self.shdr_table_dirty = true; |
| 856 | | } |
| 857 | | |
| 858 | | { |
| 859 | | // Iterate over symbols, populating free_list and last_text_block. |
| 860 | | if (self.symbols.items.len != 1) { |
| 861 | | @panic("TODO implement setting up free_list and last_text_block from existing ELF file"); |
| 862 | | } |
| 863 | | // We are starting with an empty file. The default values are correct, null and empty list. |
| 864 | | } |
| 865 | | |
| 866 | | if (self.shdr_table_dirty) { |
| 867 | | // We need to find out what the max file offset is according to section headers. |
| 868 | | // Otherwise, we may end up with an ELF binary with file size not matching the final section's |
| 869 | | // offset + it's filesize. |
| 870 | | var max_file_offset: u64 = 0; |
| 871 | | |
| 872 | | for (self.shdrs.items) |shdr| { |
| 873 | | if (shdr.sh_offset + shdr.sh_size > max_file_offset) { |
| 874 | | max_file_offset = shdr.sh_offset + shdr.sh_size; |
| 875 | | } |
| 876 | | } |
| 877 | | |
| 878 | | try self.base.file.?.pwriteAll(&[_]u8{0}, max_file_offset); |
| 879 | | } |
| 880 | | |
| 881 | 845 | if (self.base.options.module) |module| { |
| 882 | 846 | if (self.zig_module_index == null and !self.base.options.use_llvm) { |
| 883 | 847 | const index: File.Index = @intCast(try self.files.addOne(gpa)); |
| ... | ... | @@ -1469,9 +1433,11 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node |
| 1469 | 1433 | .p32 => @alignOf(elf.Elf32_Shdr), |
| 1470 | 1434 | .p64 => @alignOf(elf.Elf64_Shdr), |
| 1471 | 1435 | }; |
| 1472 | | const allocated_size = self.allocatedSize(self.shdr_table_offset.?); |
| 1473 | 1436 | const needed_size = self.shdrs.items.len * shsize; |
| 1474 | | |
| 1437 | const allocated_size = if (self.shdr_table_offset) |off| |
| 1438 | self.allocatedSize(off) |
| 1439 | else |
| 1440 | 0; |
| 1475 | 1441 | if (needed_size > allocated_size) { |
| 1476 | 1442 | self.shdr_table_offset = null; // free the space |
| 1477 | 1443 | self.shdr_table_offset = self.findFreeSpace(needed_size, shalign); |