Недавно всё-таки нашел пусть и извращенную замену для:
asm volatile ("leal 1f-virus_start(%0),%%eax; jmp *%%eax; 1:"
:: "r"(nloc):"%eax");
void __attribute__((stdcall)) jmp(uint32_t addr) {
*(unsigned int*)(&addr - 1) = addr;
}
...
/* давим оптимизацию */
if (foobar == 0xdeadbeef)
goto L;
uint32_t addr = nloc + (uint32_t)&&L - (uint32_t)&virus_start;
jmp(addr);
L: