Rust can't compile truly freestanding, position-dependent code. It attempts to access global variables through _GLOBAL_OFFSET_TABLE_.
Currently it seems the best workaround is to compile emitted LLVM bitcode with clang -ffreestanding. However, optimizations made by clang could break things.