simplify mapping
This commit is contained in:
21
src/main.zig
21
src/main.zig
@@ -138,18 +138,15 @@ fn loadStaticElf(ehdr: elf.Header, file_reader: *std.fs.File.Reader) !usize {
|
|||||||
const base = try posix.mmap(
|
const base = try posix.mmap(
|
||||||
hint,
|
hint,
|
||||||
maxva - minva,
|
maxva - minva,
|
||||||
posix.PROT.NONE,
|
posix.PROT.WRITE,
|
||||||
.{ .TYPE = .PRIVATE, .ANONYMOUS = true, .FIXED = !dynamic },
|
.{ .TYPE = .PRIVATE, .ANONYMOUS = true, .FIXED_NOREPLACE = !dynamic },
|
||||||
-1,
|
-1,
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
posix.munmap(base);
|
|
||||||
|
|
||||||
const flags = posix.MAP{ .TYPE = .PRIVATE, .ANONYMOUS = true, .FIXED = true };
|
|
||||||
var phdrs = ehdr.iterateProgramHeaders(file_reader);
|
var phdrs = ehdr.iterateProgramHeaders(file_reader);
|
||||||
var phdr_idx: u32 = 0;
|
|
||||||
errdefer posix.munmap(base);
|
errdefer posix.munmap(base);
|
||||||
while (try phdrs.next()) |phdr| : (phdr_idx += 1) {
|
while (try phdrs.next()) |phdr| {
|
||||||
if (phdr.p_type != elf.PT_LOAD) continue;
|
if (phdr.p_type != elf.PT_LOAD) continue;
|
||||||
if (phdr.p_memsz == 0) continue;
|
if (phdr.p_memsz == 0) continue;
|
||||||
|
|
||||||
@@ -158,17 +155,7 @@ fn loadStaticElf(ehdr: elf.Header, file_reader: *std.fs.File.Reader) !usize {
|
|||||||
var start = mem.alignBackward(usize, phdr.p_vaddr, page_size);
|
var start = mem.alignBackward(usize, phdr.p_vaddr, page_size);
|
||||||
const base_for_dyn = if (dynamic) @intFromPtr(base.ptr) else 0;
|
const base_for_dyn = if (dynamic) @intFromPtr(base.ptr) else 0;
|
||||||
start += base_for_dyn;
|
start += base_for_dyn;
|
||||||
// NOTE: We can't use a single file-backed mmap for the segment, because p_memsz may be
|
const ptr: []align(page_size) u8 = @as([*]align(page_size) u8, @ptrFromInt(start))[0..size];
|
||||||
// larger than p_filesz. This difference accounts for the .bss section, which must be
|
|
||||||
// zero-initialized.
|
|
||||||
const ptr = try posix.mmap(
|
|
||||||
@as(?[*]align(page_size) u8, @ptrFromInt(start)),
|
|
||||||
size,
|
|
||||||
posix.PROT.WRITE,
|
|
||||||
flags,
|
|
||||||
-1,
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
try file_reader.seekTo(phdr.p_offset);
|
try file_reader.seekTo(phdr.p_offset);
|
||||||
if (try file_reader.read(ptr[offset..][0..phdr.p_filesz]) != phdr.p_filesz)
|
if (try file_reader.read(ptr[offset..][0..phdr.p_filesz]) != phdr.p_filesz)
|
||||||
return UnfinishedReadError.UnfinishedRead;
|
return UnfinishedReadError.UnfinishedRead;
|
||||||
|
|||||||
Reference in New Issue
Block a user