summaryrefslogtreecommitdiff
path: root/sys/kern/link_elf.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/link_elf.c')
-rw-r--r--sys/kern/link_elf.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 2dff2ea79a36..a3115b554d86 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -388,7 +388,9 @@ link_elf_link_common_finish(linker_file_t lf)
return (0);
}
+#ifdef RELOCATABLE_KERNEL
extern vm_offset_t __startkernel, __endkernel;
+#endif
static unsigned long kern_relbase = KERNBASE;
@@ -424,7 +426,7 @@ link_elf_init(void* arg)
ef = (elf_file_t) linker_kernel_file;
ef->preloaded = 1;
-#ifdef __powerpc__
+#ifdef RELOCATABLE_KERNEL
ef->address = (caddr_t) (__startkernel - KERNBASE);
#else
ef->address = 0;
@@ -436,7 +438,7 @@ link_elf_init(void* arg)
if (dp != NULL)
parse_dynamic(ef);
-#ifdef __powerpc__
+#ifdef RELOCATABLE_KERNEL
linker_kernel_file->address = (caddr_t)__startkernel;
linker_kernel_file->size = (intptr_t)(__endkernel - __startkernel);
kern_relbase = (unsigned long)__startkernel;
@@ -1860,7 +1862,7 @@ link_elf_strtab_get(linker_file_t lf, caddr_t *strtab)
return (ef->ddbstrcnt);
}
-#if defined(__i386__) || defined(__amd64__) || defined(__aarch64__)
+#if defined(__i386__) || defined(__amd64__) || defined(__aarch64__) || defined(__powerpc__)
/*
* Use this lookup routine when performing relocations early during boot.
* The generic lookup routine depends on kobj, which is not initialized
@@ -1896,8 +1898,14 @@ link_elf_ireloc(caddr_t kmdp)
ef->modptr = kmdp;
ef->dynamic = (Elf_Dyn *)&_DYNAMIC;
- parse_dynamic(ef);
+
+#ifdef RELOCATABLE_KERNEL
+ ef->address = (caddr_t) (__startkernel - KERNBASE);
+#else
ef->address = 0;
+#endif
+ parse_dynamic(ef);
+
link_elf_preload_parse_symbols(ef);
relocate_file1(ef, elf_lookup_ifunc, elf_reloc, true);
}