diff --git a/hypervisor/Makefile b/hypervisor/Makefile index f7bb32aee..63c951e71 100644 --- a/hypervisor/Makefile +++ b/hypervisor/Makefile @@ -63,12 +63,14 @@ LDFLAGS += -Wl,--gc-sections -nostartfiles -nostdlib LDFLAGS += -Wl,-n,-z,max-page-size=0x1000 LDFLAGS += -Wl,-z,noexecstack +ifeq (y, $(CONFIG_RELOC)) # on X86_64, when build with "-pie", GCC fails on linking R_X86_64_32 # relocations with "recompile with fPIC" error, because it may cause # run-time relocation overflow if it runs at address above 4GB. # We know it's safe because Hypervisor runs under 4GB. "noreloc-overflow" # is used to avoid the compile error LDFLAGS += -pie -z noreloc-overflow +endif ARCH_CFLAGS += -gdwarf-2 ARCH_ASFLAGS += -gdwarf-2 -DASSEMBLER=1 diff --git a/hypervisor/arch/x86/Kconfig b/hypervisor/arch/x86/Kconfig index 81f683719..b30583eda 100644 --- a/hypervisor/arch/x86/Kconfig +++ b/hypervisor/arch/x86/Kconfig @@ -123,3 +123,7 @@ config UEFI_OS_LOADER_NAME config MTRR_ENABLED bool default y + +config RELOC + bool "Enable relocation" + default n diff --git a/hypervisor/boot/reloc.c b/hypervisor/boot/reloc.c index 4bb6b5be3..7a7eefe6b 100644 --- a/hypervisor/boot/reloc.c +++ b/hypervisor/boot/reloc.c @@ -68,6 +68,7 @@ static uint64_t trampoline_relo_addr(void *addr) return (uint64_t)addr - get_hv_image_delta(); } +#ifdef CONFIG_RELOC void _relocate(void) { struct Elf64_Dyn *dyn; @@ -136,6 +137,11 @@ void _relocate(void) start = (struct Elf64_Rel *)((char *)start + size); } } +#else +void _relocate(void) +{ +} +#endif uint64_t read_trampoline_sym(void *sym) {