OSDev.org https://forum.osdev.org/ |
|
I've created an extremely useful tool for kernel developers https://forum.osdev.org/viewtopic.php?f=2&t=33360 |
Page 1 of 1 |
Author: | ckotinko [ Fri Dec 07, 2018 7:27 am ] | ||
Post subject: | I've created an extremely useful tool for kernel developers | ||
Hello I'm writing my own kernel, and after month of hitting the wall with my head I've found a way to a) boot 64bit kernels from GRUB without assembly files b) eliminate global offset table I hope it will be useful for you. My goal was to write 32bit code which deals with GRUB, creates page tables, GDT and other stuff in C++. Linker refuses to link 32bit and 64bit object files, but feels ok if you translate 32bit sources to assembly(with gcc -S), and them compile them as 64bit object files. The tool detects "#define MULTIBOOT_INTERFACE" line in source files and builds them with -m32 -S flags, then postprocesses assembly code and compiles the result into 64bit object files. Another problem is GOT with I don't want to see in my binary. This problem is solved during postprocessing stage. During postprocessing stage I insert dummy section in file header: Code: .text .Ltext_offset: Also I remove .file directive because I dislike it, and #APP / #NOAPP lines - gcc wraps my inline assembly with them. Then each GOT address calculation is modified: Code: call __x86.get_pc_thunk.bx // addl $_GLOBAL_OFFSET_TABLE_, %ebx addl $(.Ltext_offset - .), %ebx Then each reference to GOT is replaced with address of label relative to .Ltext_offset: Code: // leal .LC0@GOTOFF(%ebx), %eax movl $(.LC0-.Ltext_offset), %eax addl %ebx, %eax Upd: there is an unfixed problem with static variables: Code: int foo; void bar() { m = foo; ... foo = n; } Please move all such variables into a static structure and get a pointer to this structure: Code: struct fb_parameters { uint64 address = 0xB8000; uint32 width = 80; uint32 height = 24; uint32 pitch = 0; uint32 bpp = 0; uint32 color = 0; uint32 x = 0, w = 0; static void (*putchar)(int); }; static fb_parameters fb; void print32 (const char *format, ...) { auto f = &::fb; ... } There are still problems with instructions like movzbl, I'll fix them soon. Regards, Dmitry
|
Author: | MichaelPetch [ Fri Dec 07, 2018 7:36 pm ] |
Post subject: | Re: I've created an extremely useful tool for kernel develop |
Why not use objcopy to convert 32-bit object to 64-bit objects? |
Author: | Octocontrabass [ Sat Dec 08, 2018 2:21 am ] |
Post subject: | Re: I've created an extremely useful tool for kernel develop |
ckotinko wrote: b) eliminate global offset table There's an easier fix: -fno-pic. There's an even easier fix: use a proper cross-compiler. |
Page 1 of 1 | All times are UTC - 6 hours |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |