здравствуйте, я сегмент кода. для своей самомодификации использую функцию mprotect. также знаю о существовании некоторых статических методик, дающих мне право изменяться: 1. если я являюсь частью простенькой программки, не вызывающей абсолютно никаких внешних функций, то свойство самомодифицируемости обретаю в результате заклинания # nasm -f elf src.asm # ld -N src.o 2. если я являюсь частью программы, вызывающей внешние функции, то аналогичное свойство приобретаю следующим образом # gcc -static -Wl,-N src.c в этом случае я становлюсь непомерно толстым. для исправления этой плачевной ситуации пробовал # gcc -Wl,-N src.c но негодяй линкер ругался ... /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../../i486-slackware-linux/bin/ld: cannot find -lgcc_s ... итак, мой вопрос: "каким образом мне нужно станцевать с бубном так, чтобы выполнить нечто напоминающее пункт 2 и остаться худым?" =)
попробовал # gcc -c src.c # ld -I /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o src.o -lc -N линкуется без ошибок. Код (Text): Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x00001034 0x00000000 0x000c0 0x000c0 R E 0x4 INTERP 0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] LOAD 0x0000f4 0x080480f4 0x080480f4 0x0079c 0x007a0 RWE 0x10 DYNAMIC 0x000798 0x08048798 0x08048798 0x000c8 0x000c8 RW 0x4 NOTE 0x000108 0x08048108 0x08048108 0x00020 0x00020 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 права, как видно выше, проставляются на ура. одно только портит жизнь - прога, к сожалению, работает не долго: Код (Text): Program received signal SIGSEGV, Segmentation fault. 0xb7f12640 in strcmp () from /lib/ld-linux.so.2 1: x/i $pc 0xb7f12640 <strcmp+16>: movzx esi,BYTE PTR [ecx] Код (Text): # strace ./a.out execve("./a.out", ["./a.out"], [/* 38 vars */]) = 0 brk(0) = 0x8049000 --- SIGSEGV (Segmentation fault) @ 0 (0) --- +++ killed by SIGSEGV +++ Process 2545 detached пятой точкой чувствую, что ошибка скорее во мне, нежели в системе. при линковке без употребления -N все работает нормально, но RWE на сегмент кода, естественно, не проставляется. ps: хоть и оптимальный способ найден (использование mprotect), но все-таки спортивный интерес не дает покоя...