[haiku-commits] BRANCH xyzzy-github.x86_64 - src/system/kernel build/jam

  • From: xyzzy-github.x86_64 <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 19 Jul 2012 19:49:13 +0200 (CEST)

added 2 changesets to branch 'refs/remotes/xyzzy-github/x86_64'
old head: b2cd72d8f3c4a3710fdbaf36802de3d6e74a4066
new head: 385d69fc0177827257822eec1274f4286bc6600d

----------------------------------------------------------------------------

0cbce9a: A few 64-bit fixes for ELF/module code.

385d69f: 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.

                                      [ Alex Smith <alex@xxxxxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

7 files changed, 91 insertions(+), 49 deletions(-)
build/jam/BuildSetup         |   20 ++++++-----
build/jam/FloppyBootImage    |   11 ++++--
build/jam/KernelRules        |   20 ++++++++++-
configure                    |    3 ++
src/system/kernel/Jamfile    |   72 ++++++++++++++++++++++----------------
src/system/kernel/elf.cpp    |   12 +++----
src/system/kernel/module.cpp |    2 +-

############################################################################

Commit:      0cbce9aa4732e96acd9d593cb86ca0847a61d051

Author:      Alex Smith <alex@xxxxxxxxxxxxxxxx>
Date:        Thu Jul 19 11:45:17 2012 UTC

A few 64-bit fixes for ELF/module code.

----------------------------------------------------------------------------

diff --git a/src/system/kernel/elf.cpp b/src/system/kernel/elf.cpp
index e4682fe..822d818 100644
--- a/src/system/kernel/elf.cpp
+++ b/src/system/kernel/elf.cpp
@@ -709,7 +709,7 @@ static status_t
 elf_parse_dynamic_section(struct elf_image_info *image)
 {
        elf_dyn *d;
-       int32 neededOffset = -1;
+       ssize_t neededOffset = -1;
 
        TRACE(("top of elf_parse_dynamic_section\n"));
 
@@ -1139,7 +1139,7 @@ unload_elf_image(struct elf_image_info *image)
        if (atomic_add(&image->ref_count, -1) > 1)
                return;
 
-       TRACE(("unload image %ld, %s\n", image->id, image->name));
+       TRACE(("unload image %" B_PRId32 ", %s\n", image->id, image->name));
 
        unregister_elf_image(image);
        delete_elf_image(image);
@@ -1228,7 +1228,7 @@ load_elf_symbol_table(int fd, struct elf_image_info 
*image)
                goto error3;
        }
 
-       TRACE(("loaded debug %ld symbols\n", numSymbols));
+       TRACE(("loaded %" B_PRId32 " debug symbols\n", numSymbols));
 
        // insert tables into image
        image->debug_symbols = symbolTable;
@@ -1904,9 +1904,9 @@ elf_load_user_image(const char *path, Team *team, int 
flags, addr_t *entry)
                        B_PAGE_SIZE);
                if (programHeaders[i].p_flags & PF_WRITE) {
                        // rw/data segment
-                       uint32 memUpperBound = (programHeaders[i].p_vaddr % 
B_PAGE_SIZE)
+                       size_t memUpperBound = (programHeaders[i].p_vaddr % 
B_PAGE_SIZE)
                                + programHeaders[i].p_memsz;
-                       uint32 fileUpperBound = (programHeaders[i].p_vaddr % 
B_PAGE_SIZE)
+                       size_t fileUpperBound = (programHeaders[i].p_vaddr % 
B_PAGE_SIZE)
                                + programHeaders[i].p_filesz;
 
                        memUpperBound = ROUNDUP(memUpperBound, B_PAGE_SIZE);
@@ -2151,7 +2151,7 @@ load_kernel_add_on(const char *path)
                char regionName[B_OS_NAME_LENGTH];
                elf_region *region;
 
-               TRACE(("looking at program header %ld\n", i));
+               TRACE(("looking at program header %" B_PRId32 "\n", i));
 
                switch (programHeaders[i].p_type) {
                        case PT_LOAD:
diff --git a/src/system/kernel/module.cpp b/src/system/kernel/module.cpp
index a2b5157..81039b8 100644
--- a/src/system/kernel/module.cpp
+++ b/src/system/kernel/module.cpp
@@ -1100,7 +1100,7 @@ register_preloaded_module_image(struct preloaded_image* 
image)
        int32 index = 0;
 
        TRACE(("register_preloaded_module_image(image = %p, name = \"%s\")\n",
-               image, image->name));
+               image, image->name.Pointer()));
 
        image->is_module = false;
 

############################################################################

Commit:      385d69fc0177827257822eec1274f4286bc6600d

Author:      Alex Smith <alex@xxxxxxxxxxxxxxxx>
Date:        Thu Jul 19 16:53:46 2012 UTC

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.

----------------------------------------------------------------------------

diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup
index 2903225..49a6d35 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 1af9d5b..2bfe08f 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 25b2260..091e100 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 <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) ;
diff --git a/configure b/configure
index 2b0dd89..160679c 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 d40862b..0937fbb 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
-
-       kernel_arch_$(TARGET_KERNEL_ARCH).o
-       kernel_platform_$(TARGET_BOOT_PLATFORM).o
-
-       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
-
-       $(HAIKU_STATIC_LIBSUPC++)
-
-       : $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
-       : -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
-         $(TARGET_KERNEL_PIC_LINKFLAGS)
-;
+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
+
+               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
+
+               $(HAIKU_STATIC_LIBSUPC++)
+
+               : $(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) ;


Other related posts: