 The kernel runtime linker sets the addresses of these functions when the kernel is combined together in memory during boot.This does not work for kernel loadable modules though - weak symbol in the kernel is not replaced with kernel module symbol when the module is loaded.C preprocessor (CPP) conditional constructs can also be used to switch between different versions of a symbol.