diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2015-02-21 23:20:05 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2015-02-21 23:20:05 +0000 |
commit | 03bb9e58897ceb7ff3fdac83582df1de1cf249c0 (patch) | |
tree | 8f2a27a6691bdf9abb4cbe95cbc7329d4fc7d26f | |
parent | 32241f2de462a3c017304705d414b9dcc9725984 (diff) | |
download | FreeBSD-src-03bb9e58897ceb7ff3fdac83582df1de1cf249c0.zip FreeBSD-src-03bb9e58897ceb7ff3fdac83582df1de1cf249c0.tar.gz |
Make kernel ELF image parsing not crash for kernels running at locations
other than their link address.
-rw-r--r-- | sys/kern/link_elf.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 6274bf1..3cf19e1 100644 --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -381,6 +381,8 @@ link_elf_link_common_finish(linker_file_t lf) return (0); } +extern vm_offset_t __startkernel; + static void link_elf_init(void* arg) { @@ -409,7 +411,11 @@ link_elf_init(void* arg) ef = (elf_file_t) linker_kernel_file; ef->preloaded = 1; +#ifdef __powerpc64__ + ef->address = (caddr_t) (__startkernel - KERNBASE); +#else ef->address = 0; +#endif #ifdef SPARSE_MAPPING ef->object = 0; #endif @@ -417,7 +423,7 @@ link_elf_init(void* arg) if (dp != NULL) parse_dynamic(ef); - linker_kernel_file->address = (caddr_t) KERNBASE; + linker_kernel_file->address += KERNBASE; linker_kernel_file->size = -(intptr_t)linker_kernel_file->address; if (modptr != NULL) { |