Dynamic relocations are a solution in search of a problem. It's entirely possible to write truly position independent code (not the same as -fpic and friends, which just emit relocs). It's entirely possible for compilers to output such code. But GCC does everything in its power to force dynamic relocations in, so that there's additional justification for the dynamic linker.