problem with higher half kernel and grub

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
McZ

problem with higher half kernel and grub

Post by McZ »

I have restarted with my OS development but now try to use GRUB instead of making my own..

So I have tried to create my new kernel using the OS FAQ but I can't compile it.

this is the source just cut and paste from http://www.osdev.org/osfaq2/index.php/HigherHalfWithGdt but I can't compile it.

Here is my makefile

Code: Select all

ASM=nasm -f elf
GCC=/usr/cross/bin/i586-elf-gcc
LD=/usr/cross/bin/i586-elf-ld
CFLAGS=-Wall -Werror -nostdlib -nostartfiles -nodefaultlibs

all: kernel.bin

loader.o : loader.asm
   $(ASM) loader.asm -o loader.o 
   
gdt.o : gdt.c
   $(GCC) $(CFLAGS) -o gdt.o -c gdt.c
   
paging.o : paging.c
   $(GCC) $(CFLAGS) -o paging.o -c paging.c
   
kernel.o : kernel.c
   $(GCC) $(CFLAGS) -o kernel.o -c kernel.c
   
kernel.bin : kernel.o gdt.o paging.o loader.o
   $(LD) -T linker.ld -o kernel.bin loader.o kernel.o

clean:
   rm -rf *.o
   rm -rf *.bin
I'm using cygwin gcc and nasm in windows XP and my clean crosscompiled GCC compiled by using the crosscompile section in the FAQ.

This is the error I get.

Code: Select all

$ make
/usr/cross/bin/i586-elf-ld -T linker.ld -o kernel.bin loader.o kernel.o
loader.o: In function `gdt_flush':
loader.asm:(.text+0x37): undefined reference to `gp'
make: *** [kernel.bin] Error 1
as you can se in the FAQ example code gp is defined in the gdt.c
nick8325
Member
Member
Posts: 200
Joined: Wed Oct 18, 2006 5:49 am

Re:problem with higher half kernel and grub

Post by nick8325 »

I wonder if adding -fno-leading-underscore to CFLAGS would work. Without it, some versions of GCC will put an underscore at the front of every symbol - for example gp will become _gp.
nick8325
Member
Member
Posts: 200
Joined: Wed Oct 18, 2006 5:49 am

Re:problem with higher half kernel and grub

Post by nick8325 »

Actually, that would produce an error for kmain as well...so I don't think it can be that.

Can you run objdump -t gdt.o and see what it says? That should tell you what GCC has called all the symbols. objdump -r loader.o might help too, that will tell you what nasm expects the symbols to be called.
McZ

Re:problem with higher half kernel and grub

Post by McZ »

Here is the output from objdump for gdt.o and loader.o

Code: Select all

gdt.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 gdt.c
00000000 l    d  .text  00000000 .text
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss   00000000 .bss
00000000 l    d  .comment       00000000 .comment
00000000 g     F .text  00000094 gdt_set_gate
00000018       O *COM*  00000001 gdt
00000094 g     F .text  00000062 gdt_install
00000006       O *COM*  00000001 gp
00000000         *UND*  00000000 gdt_flush

Code: Select all

loader.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 loader.asm
00000000 l    d  *ABS*  00000000
00000000 l    d  .text  00000000 .text
00000000 l    d  .setup 00000000 .setup
00000000 l    d  .bss   00000000 .bss
00000001 l       *ABS*  00000000 MULTIBOOT_PAGE_ALIGN
00000002 l       *ABS*  00000000 MULTIBOOT_MEMORY_INFO
1badb002 l       *ABS*  00000000 MULTIBOOT_HEADER_MAGIC
00000003 l       *ABS*  00000000 MULTIBOOT_HEADER_FLAGS
e4524ffb l       *ABS*  00000000 MULTIBOOT_CHECKSUM
00000000 l       .text  00000000 multiboot_header
00000028 l       .text  00000000 higherhalf
00000050 l       .text  00000000 flush2
00000000 l       .setup 00000000 trickgdt
00000006 l       .setup 00000000 gdt
0000001e l       .setup 00000000 gdt_end
00001000 l       .bss   00000000 sys_stack
00000000         *UND*  00000000 kmain
0000000c g       .text  00000000 start
00000000         *UND*  00000000 gp
00000034 g       .text  00000000 gdt_flush
I have cleaned the kernel project (deleted all files not needed for compiling like source makefile) and recompiled it and now I get this:

This is with -fno-leading-underscore

Code: Select all

$ make
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
 -fno-leading-underscore -o kernel.o -c kernel.c
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
 -fno-leading-underscore -o gdt.o -c gdt.c
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
 -fno-leading-underscore -o paging.o -c paging.c
nasm -f elf loader.asm -o loader.o
/usr/cross/bin/i586-elf-ld -T linker.ld -o kernel.bin loader.o kernel.o
loader.o: In function `gdt_flush':
loader.asm:(.text+0x37): undefined reference to `gp'
kernel.o: In function `kmain':
kernel.c:(.text+0xc1): undefined reference to `init_paging'
kernel.c:(.text+0xc6): undefined reference to `gdt_install'
make: *** [kernel.bin] Error 1
and this is without -fno-leading-underscore

Code: Select all

$ make
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
 -o kernel.o -c kernel.c
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
 -o gdt.o -c gdt.c
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
 -o paging.o -c paging.c
nasm -f elf loader.asm -o loader.o
/usr/cross/bin/i586-elf-ld -T linker.ld -o kernel.bin loader.o kernel.o
loader.o: In function `gdt_flush':
loader.asm:(.text+0x37): undefined reference to `gp'
kernel.o: In function `kmain':
kernel.c:(.text+0xc1): undefined reference to `init_paging'
kernel.c:(.text+0xc6): undefined reference to `gdt_install'
make: *** [kernel.bin] Error 1
nick8325
Member
Member
Posts: 200
Joined: Wed Oct 18, 2006 5:49 am

Re:problem with higher half kernel and grub

Post by nick8325 »

Um. Your linker command doesn't include gdt.o :)

You might want to have something like
OBJFILES=kernel.o paging.o gdt.o loader.o
in your Makefile, and then replace the rules for compiling the .o files with

%.o : %.c
$(GCC) $(CFLAGS) -o $(@) -c $(<)
%.o : %.asm
$(ASM) $(<) -o $(@)

which will tell make that it can produce a .o file from a .c file or a .asm file by running the above commands. Then just change your kernel.bin line so it says
kernel.bin : $(OBJFILES)
and then to tell make about new source files you will just have to add the .o files to the OBJFILES line.
McZ

Re:problem with higher half kernel and grub

Post by McZ »

Thank you :)

I have made the changes to the makefile and now it works :)
Post Reply