Go Bare Bones: Difference between revisions

[unchecked revision][unchecked revision]
Content deleted Content added
No edit summary
m Bot: Replace deprecated source tag with syntaxhighlight
Line 15:
The first thing you should do is set up a GCC Cross Compiler that supports Go. To do this read and follow [[GCC Cross-Compiler]] to the letter with one exception. When configuring the build for GCC we need to enable Go to get the i686-elf-gccgo compiler.
 
So instead of using: <sourcesyntaxhighlight lang="bash">../gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers</sourcesyntaxhighlight> We use: <sourcesyntaxhighlight lang="bash">../gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++,go --without-headers</sourcesyntaxhighlight>
 
== Overview ==
Line 111:
 
You can then assemble boot.s using:
<sourcesyntaxhighlight lang="bash">i686-elf-as boot.s -o boot.o</sourcesyntaxhighlight>
 
== Writing the Terminal package in Go ==
Line 213:
</source>
 
Compile using: <sourcesyntaxhighlight lang="bash">i686-elf-gccgo -static -Werror -nostdlib -nostartfiles -nodefaultlibs -c terminal.go -o terminal.go.o</sourcesyntaxhighlight>
 
== How imported packages are found ==
Line 224:
* .o
 
A .gox file contains just the import data. If you wanted to extract it from our terminal.go.o object file we use: <sourcesyntaxhighlight lang="bash">i686-elf-objcopy -j .go_export terminal.go.o terminal.gox</sourcesyntaxhighlight>
 
== Writing a kernel in Go ==
Line 230:
Now we create the file kernel.go that contains the Main() function called from our bootstrap assembly we've already created and compiled above. It will import the terminal package we also created & compiled. Then we use that package to print text to the screen.
 
<sourcesyntaxhighlight lang="go">package kernel
 
import "terminal"
Line 247:
// Print our Hello, World!
terminal.Print("Hello, Kernel World!\n")
}</sourcesyntaxhighlight>
 
Compile using: <sourcesyntaxhighlight lang="bash">i686-elf-gccgo -static -Werror -nostdlib -nostartfiles -nodefaultlibs -c kernel.go -o kernel.go.o</sourcesyntaxhighlight>
 
== Linking the Kernel ==
Line 301:
 
You can link your kernel using:
<sourcesyntaxhighlight lang="bash">i686-elf-gcc -T linker.ld -o myos.bin -ffreestanding -O2 -nostdlib boot.o terminal.go.o kernel.go.o -lgcc</sourcesyntaxhighlight>
 
The file myos.bin is now your kernel. Note that we are linking against [[libgcc]], which implements various routines that your cross-compiler depends on. Leaving it out will give you problems in the future.
Line 310:
 
QEMU supports booting multiboot kernels directly without using a bootable medium:
<sourcesyntaxhighlight lang="bash">qemu-system-i386 -kernel myos.bin</sourcesyntaxhighlight>
 
== External Links ==