Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Как сделать работоспособным присваивание main?

#c


Хочу скомпилировать такой код:

void function () {
  puts("Hello world");
}

main = function;


Местами он компилируется, но при выполнении падает с ошибкой, местами не компилируется:


prog.c:5:1: error: initializer element is not computable at load time
 main = function;
 ^



Как сделать, чтобы такое скомпилировалась, запустилась и не упало хоть где-нибудь?



http://ideone.com/BZMp2V - изменение void на int и добавление return 0 не помогает:

int function () {
  puts("Hello world");
  return 0;
}

main = function;


На ideone программы 32-битные, так что с кастом указателя в неявный int тоже не связано.
    


Ответы

Ответ 1



Задание выполнено, сэр! #include #include void func () { puts("xa-xa-xa"); exit(0); } void *main = func; avp@wubu:hashcode$ gcc t.c --entry=func && ./a.out xa-xa-xa avp@wubu:hashcode$ Правда, пришлось добавить exit(). Без exit валится. Если посмотреть в gdb, (gdb) layout asm то func() завершается вот так 0x400535 pop %rbp │ 0x400536 retq │ Смотрим стек (gdb) si (gdb) p $sp $3 = (void *) 0x7fffffffde70 (gdb) p *(0x7fffffffde70) $5 = 1 (gdb) и видим тут лежит 1, а не нормальный адрес возврата

Ответ 2



На каждую проблему найдётся свой #define: void function () { puts("Hello world"); } #define main static main #define function 0 main = function; int main() { function(); } Проверка выполнения.

Ответ 3



Другой вариант: использовать вложенные функции (расширение gcc): void f() { void (*main)(); void function () { puts("Hello world"); } main = function; main(); } int main() { f(); }

Комментариев нет:

Отправить комментарий