Clang 3.9.0 changes how weak extern is handled. They now use the got to
handle them. This is a problem as ld.bfd doesn't fill out any default
value in the got so pointers become NULL. This caused the kernel to fail
to boot as we use this in linker sets.
This fixes the issue by setting s default value in the got. The kernel
still loads data through it, but because we always load it at a fixed virtual
address the address it finds is valid.
There is an LLVM bug with some background information at the following,
however I think this is in fact a binutils bug the change in behaviour has
found.
https://llvm.org/bugs/show_bug.cgi?id=30848