Вопрос

Я написал "опасную" программу на C ++, которая перескакивает назад и вперед от одного фрейма стека к другому.Цель состоит в том, чтобы перейти с самого низкого уровня стека вызовов к вызывающему абоненту, что-то сделать, а затем снова перейти вниз, каждый раз пропуская все промежуточные вызовы.

Я делаю это, вручную изменяя базовый адрес стека (настройка %ebp) и переход к адресу метки.Это полностью работает, как с gcc, так и с icc, без какого-либо повреждения стека вообще.День, когда это сработало, был классным днем.

Теперь я беру ту же программу и переписываю ее на C, и это не работает.В частности, это не работает с gcc v4.0.1 (Mac OS).Как только я перехожу к новому фрейму стека (с правильно установленным базовым указателем стека), выполняются следующие инструкции, которые выполняются непосредственно перед вызовом fprintf.Последняя инструкция, перечисленная здесь, завершается сбоем, разыменовывая NULL:

lea    0x18b8(%ebx), %eax
mov    (%eax), %eax
mov    (%eax), %eax

Я провел некоторую отладку, и я выяснил, что, установив %ebx регистрируйтесь вручную, когда я переключаю кадры стека (используя значение, которое я наблюдал перед тем, как покинуть функцию в первую очередь), я исправляю ошибку.Я читал, что этот регистр имеет дело с "кодом, не зависящим от позиции" в gcc.

Что такое позиционно-независимый код?Как работает позиционно-независимый код?На что указывает этот регистр?

Это было полезно?

Решение

PIC - это код, который перемещается динамически при его загрузке.Код, который не является PIC, имеет адреса перехода и вызова, установленные во время соединения.У PIC есть таблица, которая ссылается на все места, где существуют такие значения, очень похоже на .dll.

Когда изображение будет загружено, загрузчик будет динамически обновлять эти значения.Другие схемы ссылаются на значение данных, которое определяет "базу", а целевой адрес определяется путем выполнения вычислений на базе.База обычно устанавливается загрузчиком повторно.

Наконец, в других схемах используются различные трамплины, которые требуют известных относительных смещений.Относительные смещения содержат код и / или данные, которые обновляются загрузчиком.

Существуют разные причины, по которым выбираются разные схемы.Некоторые из них быстры при запуске, но медленнее загружаются.Некоторые из них быстро загружаются, но имеют меньшую производительность во время выполнения.

Другие советы

EBX указывает на Глобальную таблицу смещений.Видишь эта ссылка о PIC на i386.Ссылка объясняет, что такое PIC и как EBX используется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top