| ... | @@ -22,6 +22,10 @@ pub fn lookup(vername: []const u8, name: []const u8) usize { | ... | @@ -22,6 +22,10 @@ pub fn lookup(vername: []const u8, name: []const u8) usize { |
| 22 | }) { | 22 | }) { |
| 23 | const this_ph = @intToPtr(*elf.Phdr, ph_addr); | 23 | const this_ph = @intToPtr(*elf.Phdr, ph_addr); |
| 24 | switch (this_ph.p_type) { | 24 | switch (this_ph.p_type) { |
| | 25 | // On WSL1 as well as older kernels, the VDSO ELF image is pre-linked in the upper half |
| | 26 | // of the memory space (e.g. p_vaddr = 0xffffffffff700000 on WSL1). |
| | 27 | // Wrapping operations are used on this line as well as subsequent calculations relative to base |
| | 28 | // (lines 47, 78) to ensure no overflow check is tripped. |
| 25 | elf.PT_LOAD => base = vdso_addr +% this_ph.p_offset -% this_ph.p_vaddr, | 29 | elf.PT_LOAD => base = vdso_addr +% this_ph.p_offset -% this_ph.p_vaddr, |
| 26 | elf.PT_DYNAMIC => maybe_dynv = @intToPtr([*]usize, vdso_addr + this_ph.p_offset), | 30 | elf.PT_DYNAMIC => maybe_dynv = @intToPtr([*]usize, vdso_addr + this_ph.p_offset), |
| 27 | else => {}, | 31 | else => {}, |