21 lines
797 B
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));
|
|
}
|
|
}
|
|
}
|