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.
The other sections are standard (.rodata, .data, .bss) and work fine as-is.
Removing the ". = ALIGN(0x1000);" works fine, but I'd like syscall.o aligned on its own pages (just so I can mark those pages as accessible from ring 3). Possibly there is another way to do this?
Looks like a typical case of pushing your multiboot header beyond the first 8k of your kernel executable. Make sure that the multiboot header comes close to the beginning of your kernel.
The multiboot header must be within the first 8k of the binary. You're probably moving it too far to the end this way. Make sure to have the object file with the multiboot header first. Then aligning syscall.o should work fine.