lexszero
06.01.2012 01:55 nyapad
Есть такой быдлокод: http://paste.pocoo.org/show/530725/
Скастовал на него gcc -m32 -O0, дизасмлю и вижу, что после вызова printf стоит тупо ноп и выход из main, даже goto проебалось, алсо вызов f() делает call по адресу куска вычисления code_size, хуй знает почему — т.е. все тупо зацикливается.
Попробовал тот же быдлокод скормить шлангу — получил _code_start = 0x01 и соответственно сегфолт. От исходной асмовставки не нашел даже нопа.
ЧЯДНТ ЧЯДНТ
Recommended by:
@xl0
_code_start недостижим и выкомпиливается даже при -O0. В результате лейбл видимо начинает указыват на начало main.
--- test.c.orig 2012-01-06 05:05:36.506259543 +0200
+++ test.c 2012-01-06 05:06:49.774016767 +0200
@@ -3,6 +3,8 @@
typedef int(*int_func)(void);
+int i = 0;
+
int main() {
const code_size = &&_code_end — &&_code_start;
@@ -10,8 +12,9 @@
int_func f = &&_code_start;
printf("%i\n", f());
-
- goto _code_end;
+
+ if (!i)
+ goto _code_end;
_code_start:
asm volatile(
xl0@bzz:~$ ./a.out
Code start 0x8048446, size 13
2
xl0@bzz:~$
А ещё ты наркоман.
КОСТЫЛИ. в мане нашел как включить DCE, но не нашел, как его выключить.
Указатель на лейбл — само по себе костыль, к тому-же не ясно, зачем он нужен.
я собирался поразвлекаться с самомодификацией кода
Запихай ассебмлер в функцию, в чем проблема?
тогда надо высчитывать длину кода прелюдии — всякой стекоебли етц
__attribute__((bare)), кажется.
Второй вариант — захерачь лейбл _в_ асмовом коде.
а гэцэцэ узнает об этом лейбле? он же тупо скармливает говно из asm() ассемблеру as is
Лейбл это symbol, при кинковке узнает.
дока говорит только про naked, и то только на небольшой пачке архитектур, среди которых нет x86
http://dumpz.org/130423/
Как по мне, ассемблер лучше бы делать отдельным файлом, да и складывать в отдельную секцию. Ты ж линкер-скрипты писать умеешь? ;)
Да, bare это из другой оперы.