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.
If const char[] used it outputs "Hello, world!" as it should. Otherwise, nothing will be displayed (only blue background will).
Before that, it checks multiboot and set long mode. Maybe the problems are in GDT?
The difference between the two is where the string is stored.
const char * - the string is stored in the .rodata section
const char[] - the string is stored on the stack
This should work, except for the fact that you are giving your linker conflicting information. When you compile kmain.c you link it at the same time. So kmain.o is an executable, not a simple object file. The linker assumed that the file is loaded at 0x400000 (the default), with the .rodata section at 0x400151.
You then link the executable again, this time telling it that the program is loaded at 0x100000, with the .rodata section at 0x1001f0. When the program runs it thinks the string is at 0x400151, and prints the empty data there.
The answer is that you need to use the -c switch when compiling kmain.c to produce an object file rather than an executable.