diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-01 16:29:59 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-04 09:08:50 +0100 |
| commit | b1136a695f5cc463bafd6727ff5bb60d618d8ce9 (patch) | |
| tree | 27b7e8a01b892487e3b62570bd750af245eb7f5c /src | |
| parent | 1be94878e37c4038a33089b432f99c085361ee0f (diff) | |
| download | zig-b1136a695f5cc463bafd6727ff5bb60d618d8ce9.tar.gz zig-b1136a695f5cc463bafd6727ff5bb60d618d8ce9.zip | |
elf: remove now obsolete allocateSegment helper
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Elf.zig | 80 |
1 files changed, 32 insertions, 48 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 447b54ad19..10fcc904ab 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -484,38 +484,6 @@ fn findFreeSpace(self: *Elf, object_size: u64, min_alignment: u64) u64 { return start; } -const AllocateSegmentOpts = struct { - addr: u64, - memsz: u64, - filesz: u64, - alignment: u64, - flags: u32 = elf.PF_R, -}; - -pub fn allocateSegment(self: *Elf, opts: AllocateSegmentOpts) error{OutOfMemory}!u16 { - const off = self.findFreeSpace(opts.filesz, opts.alignment); - const index = try self.addPhdr(.{ - .type = elf.PT_LOAD, - .offset = off, - .filesz = opts.filesz, - .addr = opts.addr, - .memsz = opts.memsz, - .@"align" = opts.alignment, - .flags = opts.flags, - }); - log.debug("allocating phdr({d})({c}{c}{c}) from 0x{x} to 0x{x} (0x{x} - 0x{x})", .{ - index, - if (opts.flags & elf.PF_R != 0) @as(u8, 'R') else '_', - if (opts.flags & elf.PF_W != 0) @as(u8, 'W') else '_', - if (opts.flags & elf.PF_X != 0) @as(u8, 'X') else '_', - off, - off + opts.filesz, - opts.addr, - opts.addr + opts.memsz, - }); - return index; -} - const AllocateAllocSectionOpts = struct { name: [:0]const u8, phdr_index: u16, @@ -590,11 +558,15 @@ pub fn initMetadata(self: *Elf) !void { comptime assert(number_of_zig_segments == 5); if (self.phdr_zig_load_re_index == null) { - self.phdr_zig_load_re_index = try self.allocateSegment(.{ + const filesz = self.base.options.program_code_size_hint; + const off = self.findFreeSpace(filesz, self.page_size); + self.phdr_zig_load_re_index = try self.addPhdr(.{ + .type = elf.PT_LOAD, + .offset = off, + .filesz = filesz, .addr = if (ptr_bit_width >= 32) 0x8000000 else 0x8000, - .memsz = self.base.options.program_code_size_hint, - .filesz = self.base.options.program_code_size_hint, - .alignment = self.page_size, + .memsz = filesz, + .@"align" = self.page_size, .flags = elf.PF_X | elf.PF_R | elf.PF_W, }); } @@ -603,33 +575,45 @@ pub fn initMetadata(self: *Elf) !void { // We really only need ptr alignment but since we are using PROGBITS, linux requires // page align. const alignment = if (is_linux) self.page_size else @as(u16, ptr_size); - self.phdr_zig_got_index = try self.allocateSegment(.{ + const filesz = @as(u64, ptr_size) * self.base.options.symbol_count_hint; + const off = self.findFreeSpace(filesz, alignment); + self.phdr_zig_got_index = try self.addPhdr(.{ + .type = elf.PT_LOAD, + .offset = off, + .filesz = filesz, .addr = if (ptr_bit_width >= 32) 0x4000000 else 0x4000, - .memsz = @as(u64, ptr_size) * self.base.options.symbol_count_hint, - .filesz = @as(u64, ptr_size) * self.base.options.symbol_count_hint, - .alignment = alignment, + .memsz = filesz, + .@"align" = alignment, .flags = elf.PF_R | elf.PF_W, }); } if (self.phdr_zig_load_ro_index == null) { const alignment = if (is_linux) self.page_size else @as(u16, ptr_size); - self.phdr_zig_load_ro_index = try self.allocateSegment(.{ + const filesz: u64 = 1024; + const off = self.findFreeSpace(filesz, alignment); + self.phdr_zig_load_ro_index = try self.addPhdr(.{ + .type = elf.PT_LOAD, + .offset = off, + .filesz = filesz, .addr = if (ptr_bit_width >= 32) 0xc000000 else 0xa000, - .memsz = 1024, - .filesz = 1024, - .alignment = alignment, + .memsz = filesz, + .@"align" = alignment, .flags = elf.PF_R | elf.PF_W, }); } if (self.phdr_zig_load_rw_index == null) { const alignment = if (is_linux) self.page_size else @as(u16, ptr_size); - self.phdr_zig_load_rw_index = try self.allocateSegment(.{ + const filesz: u64 = 1024; + const off = self.findFreeSpace(filesz, alignment); + self.phdr_zig_load_rw_index = try self.addPhdr(.{ + .type = elf.PT_LOAD, + .offset = off, + .filesz = filesz, .addr = if (ptr_bit_width >= 32) 0x10000000 else 0xc000, - .memsz = 1024, - .filesz = 1024, - .alignment = alignment, + .memsz = filesz, + .@"align" = alignment, .flags = elf.PF_R | elf.PF_W, }); } |
