| author | |
| committer | |
| log | ec337051a92b6f65bb29ddf41a290ea8e46b37b1 |
| tree | 155587f8b88f26fd146d3a5c87e9ea7be37c640e |
| parent | 7ae9d8089d49d3bf04b5f248caf46fc095a71290 |
`Elf*_Rela` relocations store their argument in `r_addend`, including for `R_*_RELATIVE` relocations. Unlike `Elf*_Rel` relocations, they are not applied as a delta to the destination virtual address. Instead, they are computed from `base_address + r_addend` directly.1 files changed, 1 insertions(+), 1 deletions(-)
lib/std/os/linux/start_pie.zig+1-1| ... | ... | @@ -113,7 +113,7 @@ pub fn relocate(phdrs: []elf.Phdr) void { |
| 113 | 113 | const rela = std.mem.bytesAsSlice(elf.Rela, @as([*]u8, @ptrFromInt(rela_addr))[0..rela_size]); |
| 114 | 114 | for (rela) |r| { |
| 115 | 115 | if (r.r_type() != R_RELATIVE) continue; |
| 116 | @as(*usize, @ptrFromInt(base_addr + r.r_offset)).* += base_addr + @as(usize, @bitCast(r.r_addend)); | |
| 116 | @as(*usize, @ptrFromInt(base_addr + r.r_offset)).* = base_addr + @as(usize, @bitCast(r.r_addend)); | |
| 117 | 117 | } |
| 118 | 118 | } |
| 119 | 119 | } |