Будни извращенцев-2 |
[Jun. 9th, 2009|01:24 pm] |
Иногда просто зарубает на абсолютно дурацких пустяках. А компилятор между тем противиться насилию над собой, с 4.1, эта фича вылилась в вот такой код:
80483c0: 81 ff ef be ad de cmp $0xdeadbeef,%edi
80483c6: 74 18 je 80483e0
80483c8: b8 e0 83 04 08 mov $0x80483e0,%eax
80483cd: 83 ec 0c sub $0xc,%esp
80483d0: 2d 74 80 04 08 sub $0x8048074,%eax
80483d5: 01 f8 add %edi,%eax
80483d7: 50 push %eax
80483d8: e8 8a 00 00 00 call 8048467 <jmp.2859>
80483dd: 83 c4 0c add $0xc,%esp
80483e0:
Решение для 4.1 (ключевого слова asm не избежать Ж-):
void __attribute__((noinline,stdcall)) jmp(uint32_t addr) {
*(volatile uint32_t*)(&addr - 1) = addr;
}
extern void L;
jmp(nloc + (uint32_t)&L - (uint32_t)&virus_start); asm ("L:");
|
|
|