Я написал "опасную" программу на С++, которая перескакивает назад и вперед из одного стекового кадра в другой. Цель состоит в том, чтобы перейти от самого низкого уровня стека вызовов к вызывающему, сделать что-то, а затем снова отступить назад, каждый раз пропуская все вызовы между ними.
Я делаю это, вручную изменяя базовый адрес стека (установка %ebp
) и переходя к адресу метки. Он полностью работает с gcc и icc обоими, без какой-либо стека. В этот день это был классный день.
Теперь я беру ту же программу и переписываю ее на C, и она не работает. В частности, он не работает с gcc v4.0.1 (Mac OS). Как только я перехожу к новому стеку стека (с правильным указателем базы стека), выполняются следующие инструкции, находящиеся непосредственно перед вызовом fprintf
. Последняя инструкция, приведенная здесь, сбой, разыменование NULL:
lea 0x18b8(%ebx), %eax
mov (%eax), %eax
mov (%eax), %eax
Я выполнил некоторую отладку, и я понял, что, установив регистр %ebx
вручную, когда я переключаю фреймы стека (используя значение, которое я наблюдал перед тем, как оставить функцию в первую очередь), я исправляю ошибку, Я читал, что этот регистр имеет дело с "независимым от положения кодом" в gcc.
Что такое независимый от позиции код? Как работает независимый код? На что указывает этот регистр?