Files
YukiOS/arch/x86_64/boot/relocate.zig

21 lines
797 B
Zig

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));
}
}
}