Even if you ignore the problem of self-modifying code, a completely static translation of x86 binaries is impossible. Things get hard real quick when indirect branches are involved, so you have to rely on a runtime solution when ahead of time solutions won’t work.