diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 2903225513..49a6d358dc 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -356,6 +356,7 @@ if $(HAIKU_GCC_VERSION[1]) >= 4 { HAIKU_KERNEL_PIC_CCFLAGS = -fno-pic ; HAIKU_KERNEL_PIC_LINKFLAGS = ; +HAIKU_KERNEL_ADDON_LINKFLAGS = ; switch $(HAIKU_ARCH) { case ppc : @@ -389,13 +390,16 @@ switch $(HAIKU_ARCH) { case x86_64 : { # Kernel lives in the top 2GB of the address space, use kernel code - # model. Also disable the red zone, which cannot be used in kernel - # code due to interrupts. - HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone - -fno-omit-frame-pointer ; - HAIKU_KERNEL_C++FLAGS += -mcmodel=kernel -mno-red-zone - -fno-omit-frame-pointer ; + # model. + HAIKU_KERNEL_PIC_CCFLAGS += -mcmodel=kernel ; + + # Disable the red zone, which cannot be used in kernel code due to + # interrupts, and always enable the frame pointer so stack traces are + # correct. + HAIKU_KERNEL_CCFLAGS += -mno-red-zone -fno-omit-frame-pointer ; + HAIKU_KERNEL_C++FLAGS += -mno-red-zone -fno-omit-frame-pointer ; HAIKU_KERNEL_PIC_LINKFLAGS += -z max-page-size=0x1000 ; + HAIKU_KERNEL_ADDON_LINKFLAGS += -z max-page-size=0x1000 ; # Bootloader is 32-bit. HAIKU_BOOT_LINKFLAGS += -m elf_i386_haiku ; @@ -984,7 +988,7 @@ if $(TARGET_PLATFORM) != haiku { local buildVars = ARCH CPU GCC_VERSION KERNEL_ARCH - AR CC C++ LD OBJCOPY RANLIB + AR CC C++ LD OBJCOPY RANLIB ELFEDIT INCLUDES_SEPARATOR LOCAL_INCLUDES_OPTION SYSTEM_INCLUDES_OPTION @@ -993,7 +997,7 @@ local buildVars = KERNEL_DEFINES KERNEL_CCFLAGS KERNEL_C++FLAGS - KERNEL_PIC_CCFLAGS KERNEL_PIC_LINKFLAGS + KERNEL_PIC_CCFLAGS KERNEL_PIC_LINKFLAGS KERNEL_ADDON_LINKFLAGS BOOT_CCFLAGS BOOT_C++FLAGS BOOT_LINKFLAGS WARNING_CCFLAGS WARNING_C++FLAGS diff --git a/build/jam/FloppyBootImage b/build/jam/FloppyBootImage index 1af9d5b7eb..2bfe08f6b0 100644 --- a/build/jam/FloppyBootImage +++ b/build/jam/FloppyBootImage @@ -52,7 +52,10 @@ SYSTEM_ADD_ONS_BUS_MANAGERS = $(X86_ONLY)acpi $(ATA_ONLY)ata config_manager dpc SYSTEM_ADD_ONS_FILE_SYSTEMS = bfs iso9660 attribute_overlay write_overlay ; -if $(TARGET_ARCH) != x86_64 { +if $(TARGET_ARCH) = x86_64 { + AddFilesToFloppyBootArchive system add-ons kernel bus_managers + : dpc ; +} else { # modules AddFilesToFloppyBootArchive system add-ons kernel bus_managers : $(SYSTEM_ADD_ONS_BUS_MANAGERS) ; @@ -121,7 +124,11 @@ if $(NET_BOOT) = 1 { } # boot module links -if $(TARGET_ARCH) != x86_64 { +if $(TARGET_ARCH) = x86_64 { + AddBootModuleSymlinksToFloppyBootArchive + dpc + ; +} else { AddBootModuleSymlinksToFloppyBootArchive $(SYSTEM_ADD_ONS_BUS_MANAGERS) $(PPC_ONLY)openpic diff --git a/build/jam/KernelRules b/build/jam/KernelRules index 25b2260bf1..091e100bd2 100644 --- a/build/jam/KernelRules +++ b/build/jam/KernelRules @@ -77,6 +77,24 @@ actions KernelLd bind VERSION_SCRIPT --version-script=$(VERSION_SCRIPT) } +rule KernelSo target : source +{ + # KernelSo : + + Depends $(target) : copyattr $(source) ; + + MakeLocateDebug $(1) ; + KernelSo1 $(target) : copyattr $(source) ; +} + +actions KernelSo1 +{ + $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) + + $(2[1]) --data $(2[2]) $(1) && + $(HAIKU_ELFEDIT) --output-type dyn $(1) +} + rule KernelAddon { # KernelAddon : : : ; @@ -117,7 +135,7 @@ rule KernelAddon # compile and link SetupKernel $(sources) : $(TARGET_KERNEL_PIC_FLAGS) : false ; local linkFlags = -nostdlib -Xlinker --no-undefined - -Xlinker -soname=\"$(target:G=)\" ; + -Xlinker -soname=\"$(target:G=)\" $(TARGET_KERNEL_ADDON_LINKFLAGS) ; LINKFLAGS on $(target) = [ on $(target) return $(LINKFLAGS) ] $(linkFlags) ; Main $(target) : $(sources) ; LinkAgainst $(target) : $(libs) $(kernel) ; diff --git a/configure b/configure index 2b0dd89760..160679c768 100755 --- a/configure +++ b/configure @@ -344,6 +344,7 @@ set_default_value HAIKU_CC gcc set_default_value HAIKU_LD ld set_default_value HAIKU_OBJCOPY objcopy set_default_value HAIKU_RANLIB ranlib +set_default_value HAIKU_ELFEDIT elfedit set_default_value HAIKU_YASM yasm set_default_value HAIKU_CPPFLAGS "" set_default_value HAIKU_CCFLAGS "" @@ -510,6 +511,7 @@ if [ -n "$crossToolsPrefix" ]; then get_build_tool_path LD ld get_build_tool_path OBJCOPY objcopy get_build_tool_path RANLIB ranlib + get_build_tool_path ELFEDIT elfedit fi # prepare gcc settings @@ -570,6 +572,7 @@ HAIKU_CC ?= ${HAIKU_CC} ; HAIKU_LD ?= ${HAIKU_LD} ; HAIKU_OBJCOPY ?= ${HAIKU_OBJCOPY} ; HAIKU_RANLIB ?= ${HAIKU_RANLIB} ; +HAIKU_ELFEDIT ?= ${HAIKU_ELFEDIT} ; HAIKU_YASM ?= ${HAIKU_YASM} ; HAIKU_CPPFLAGS ?= ${HAIKU_CPPFLAGS} ; HAIKU_CCFLAGS ?= ${HAIKU_CCFLAGS} ; diff --git a/src/system/kernel/Jamfile b/src/system/kernel/Jamfile index d40862b7e9..0937fbbf0a 100644 --- a/src/system/kernel/Jamfile +++ b/src/system/kernel/Jamfile @@ -134,37 +134,47 @@ KernelLd kernel_$(TARGET_ARCH) : : ; -KernelLd kernel.so : - kernel_cache.o - kernel_core.o - kernel_debug.o - kernel_device_manager.o - kernel_disk_device_manager.o - kernel_fs.o - kernel_messaging.o - kernel_posix.o - kernel_slab.o - kernel_util.o - kernel_vm.o +if $(HAIKU_ARCH) = x86_64 { + # Cannot relink everything as a shared object on x86_64 as shared library + # code is required to be position-independent. Instead create a copy of the + # executable kernel image and change the ELF header type to DYN. A bit of + # a hack, but avoids having to recompile a PIC copy of the kernel code. + # kernel.so is only used when linking modules to provide symbol information, + # this is sufficient for that purpose. + KernelSo kernel.so : kernel_$(TARGET_ARCH) ; +} else { + KernelLd kernel.so : + kernel_cache.o + kernel_core.o + kernel_debug.o + kernel_device_manager.o + kernel_disk_device_manager.o + kernel_fs.o + kernel_messaging.o + kernel_posix.o + kernel_slab.o + kernel_util.o + kernel_vm.o - kernel_arch_$(TARGET_KERNEL_ARCH).o - kernel_platform_$(TARGET_BOOT_PLATFORM).o + kernel_arch_$(TARGET_KERNEL_ARCH).o + kernel_platform_$(TARGET_BOOT_PLATFORM).o - linkhack.so + linkhack.so - # kernel libroot parts - kernel_os_main.o - kernel_os_arch_$(TARGET_ARCH).o - kernel_lib_posix.o - kernel_lib_posix_arch_$(TARGET_ARCH).o - kernel_misc.o + # kernel libroot parts + kernel_os_main.o + kernel_os_arch_$(TARGET_ARCH).o + kernel_lib_posix.o + kernel_lib_posix_arch_$(TARGET_ARCH).o + kernel_misc.o - $(HAIKU_STATIC_LIBSUPC++) + $(HAIKU_STATIC_LIBSUPC++) - : $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld - : -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar - $(TARGET_KERNEL_PIC_LINKFLAGS) -; + : $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld + : -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar + $(TARGET_KERNEL_PIC_LINKFLAGS) + ; +} NotFile kernel ; Depends kernel : kernel_$(TARGET_ARCH) ;