Kernel Loader: Difference between revisions
Line 133: | Line 133: | ||
</pre> | </pre> | ||
Then, it maps the kernel | Then, it maps the kernel at the final virtual address. | ||
<pre> | <pre> | ||
// TODO: Fill this out with pseudocode. | // TODO: Fill this out with pseudocode. | ||
</pre> | </pre> | ||
Then, it calls the kernel's libc .init_array functions. | Then, it applies the kernel's .dynamic relocations and calls the kernel's libc .init_array functions. | ||
<pre> | <pre> | ||
// This is standard libc init_array code, but called for the kernel's binary instead of kernelldr's. | // Applies all R_AARCH64_RELATIVE relocations. | ||
for (uintptr_t cur_func = final_virtual_kernel_base + init_array_offset; cur_func < final_virtual_kernel_base + init_array_end_offset; cur_func += 8) { | KernelLdr_ApplyRelocations(final_kernel_virtual_base, final_kernel_virtual_base + dynamic_offset); | ||
} | // This is standard libc init_array code, but called for the kernel's binary instead of kernelldr's. | ||
for (uintptr_t cur_func = final_virtual_kernel_base + init_array_offset; cur_func < final_virtual_kernel_base + init_array_end_offset; cur_func += 8) { | |||
((void (*)(void))(*(uint64_t *)cur_func)(); | |||
} | |||
</pre> | </pre> | ||