LINUX.ORG.RU

заставить GCC не сохранять регистры в стеке


0

0

Зачем GCC (arm-linux-gcc) сохраняет значения регистров в стеке при вызове main() ?

Делаю загрузчик и никакого стека, как в прочем и памяти на этом этапе просто нет. Можно его как-то направить на путь истинный?

Добиться невосстановления регистров при выходе удалось вечным циклом в конце while(1); Все-равно до выхода из этой функции дело не дойдет никогда :)

★★★★

Блин. Похоже что никак. Нашел китайскую доку, где эта проблема решается с помощью ассемблерной вставки еще до вызова main() и в этой вставке делаестя переход на нужное начало.

Обидно, так как это добавляет 2 лишних инструкции, а учитывая что их всего 512.... :))

alexru ★★★★
() автор топика

Не совсем в тему....
Когда то использовал GCC для AVR (микроконтроллер такой), так вот, там была возможность с помощью __attribute__ указать компилятору не формировать stack frame. Использовалась сия конструкция для написания обработчика прерывания.

P.S. На момент вызова main() указатель на вершину стека уже инициализирован - убедиться в этом можно дизассемблировав программу с помощью objdump.

P.P.S. Был еще __attribute__((noreturn)), указывающий компилятору, что функция никогда не завершится.

syomin
()
Ответ на: комментарий от syomin

Тут некому инициализировать стек :) Эта прога - это IPL (Initial Programm Loader) для DiskOnChip. Этот код - это вообще первое что выполняется после включения питания устройству.

А про обработчики прерываний - спасибо. Посмотрю как это сделано в ядре.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

noreturn не сильно красиво. тас происходит передача управления ядру вот так:

((void (*)(int, int, unsigned long))ZIMAGE_ADDR)(0, MACHINE_TYPE, PARAMS_ADDR);

и компилятор естественно считает что это из этой функции есть выход :))

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

__attribute__((naked)) судя по документации должен помочь.Ни на x86 ни на PPC он не работает, так что проверю дома.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Function-Attributes.html#Function...

naked
Use this attribute on the ARM, AVR, C4x and IP2K ports to indicate that the specified function does not need prologue/epilogue sequences generated by the compiler. It is up to the programmer to provide these sequences.

Что касается стека - на вашем месте я бы все-таки дизассемблировал программу и посмотрел что происходит до вызова main(). В моем случае GCC добавлял код, который инициализировал таблицу прерываний, сегменты data и bss а также указатель на вершину стека. Только после этого вызывался main(). Возможно, я что-то не помню, т.к. дело было достаточно давно. Кстати, есть возможность выполнить свой код до и после main().

syomin
()
Ответ на: комментарий от syomin

Я ее первым делом и дизассемблировал. Там просто одна инструкция сохранения регистров в стек. Я ее руками заменял на nop и все работает как нужно.

А про naked я вспомнил - я это-же искал когда с AVR'ами возился. Оно будет работать :)

alexru ★★★★
() автор топика
Ответ на: комментарий от anonymous

Не за что. Рекомендую посмотреть PDF'ку, которая идет с avr-libc и manual на используемую версию gcc - много вопросов отпадет.

syomin
()
Ответ на: комментарий от alexru

Итак, naked помог :) Всем спасибо.

alexru ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.