const std = @import("std"); const elf = std.elf; extern var __rela_dyn_start: u8; extern var __rela_dyn_end: u8; pub fn relocateSelf(base_addr: usize) callconv(.c) void { const rela_size = (@intFromPtr(&__rela_dyn_end) - @intFromPtr(&__rela_dyn_start)) / @sizeOf(elf.Elf64_Rela); const relas = @as([*]elf.Elf64_Rela, @ptrCast(@alignCast(&__rela_dyn_start)))[0..rela_size]; for (relas) |rela| { const offset = rela.r_offset; const addend = rela.r_addend; // const sym_index = rela.r_info >> 32; const type_ = rela.r_info & 0xffffffff; if (type_ == @intFromEnum(elf.R_X86_64.RELATIVE)) { const reloc_addr: *u64 = @ptrFromInt(offset + base_addr); reloc_addr.* = base_addr + @as(usize, @intCast(addend)); } } }