Made it possible to build kernel modules for x86_64.

Added the necessary build flags for modules, and added a module (dpc)
to the floppy image for x86_64 builds for testing purposes. The module
gets loaded correctly and its code runs without issue. Only non-trivial
addition is the different method for generating kernel.so, this is
explained in the kernel Jamfile.
This commit is contained in:
Alex Smith
2012-07-19 17:53:46 +01:00
parent 0cbce9aa47
commit 385d69fc01
5 changed files with 79 additions and 37 deletions
+12 -8
View File
@@ -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
+9 -2
View File
@@ -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
+19 -1
View File
@@ -77,6 +77,24 @@ actions KernelLd bind VERSION_SCRIPT
--version-script=$(VERSION_SCRIPT)
}
rule KernelSo target : source
{
# KernelSo <target> : <source>
Depends $(target) : <build>copyattr $(source) ;
MakeLocateDebug $(1) ;
KernelSo1 $(target) : <build>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 <name> : <sources> : <static-libraries> : <res> ;
@@ -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) ;
Vendored
+3
View File
@@ -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} ;
+36 -26
View File
@@ -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) ;