Fixes bug with 64 bit linkage
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 16 Jun 2013 04:27:50 +0000 (21:27 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 22 Jun 2013 17:29:30 +0000 (10:29 -0700)
The old style of tricking grub with the linker script is a bad idea.
Using objcopy instead.  For more info, check out:

http://forum.osdev.org/viewtopic.php?p=223931#p223931

Makefile
kern/arch/riscv/Makefile
kern/arch/x86/Makefile
kern/arch/x86/kernel64.ld
kern/src/Kbuild

index af50234..048eec7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -448,7 +448,8 @@ quiet_cmd_link-akaros = LINK    $@
                               $(gcc-lib) \
                               $(kern_cpio_obj) \
                               $(ext2_bdev_obj) ; \
-                              $(OBJDUMP) $(OBJDUMP_FLAGS) -S $@ > $@.asm
+                              $(OBJDUMP) -S $@ > $@.asm; \
+                              $(ARCH_POST_LINK_CMD)
 
 # For some reason, the if_changed doesn't work with FORCE (like it does in
 # Linux).  It looks like it can't find the .cmd file or something (also
index 8c19136..5440dca 100644 (file)
@@ -1 +1,3 @@
 CROSS_COMPILE := riscv-ros-
+# basically a nop.  this runs post-link of the kernel
+ARCH_POST_LINK_CMD = echo -n
index 3086a57..f13738a 100644 (file)
@@ -6,11 +6,14 @@ CFLAGS_KERNEL += -mcmodel=kernel
 CFLAGS_KERNEL += -mno-red-zone -ffreestanding
 CFLAGS_KERNEL += -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow
 LDFLAGS_KERNEL += -z max-page-size=0x1000
-OBJDUMP_FLAGS += -M x86-64
+# Need to change the format to 32 bit, to trick multiboot/grub1 into loading
+ARCH_POST_LINK_CMD = $(OBJCOPY) -I elf64-x86-64 -O elf32-i386 $@
 else
 CROSS_COMPILE := i686-ros-
 BITS := 32
 KERNEL_LD := kernel32.ld
+# basically a nop.  this runs post-link of the kernel
+ARCH_POST_LINK_CMD = echo -n
 endif
 
 # BITS is used in Kbuilds, so we can select bit-specific source files.
index d76bbc9..04aa5e7 100644 (file)
@@ -5,15 +5,7 @@
  * ld will offset our first section to 1MB within the actual file.  Multiboot
  * requires the header to be in the first two pages. */
 
-/* We're lying about our output format, so that grub thinks we are a 32 bit elf
- * and just loads our sections.  Since we're getting loaded into low memory, it
- * doesn't really matter (to grub) what our VMAs are.  Our LMAs are fine as
- * either 32 or 64 bit. */
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386:x86-64)
-/* This is for a pure 64 bit elf: 
 OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
-*/
 ENTRY(_start)
 KERN_LOAD_ADDR = 0xffffffffc0000000;
 
index 37ed881..44221bb 100644 (file)
@@ -44,4 +44,3 @@ obj-y                                         += trap.o
 obj-y                                          += ucq.o
 obj-y                                          += umem.o
 obj-y                                          += vfs.o
-