Что делает регистр PIC (% ebx)?

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

EBX указывает на глобальную таблицу смещения. См. эту ссылку о ПОС на i386. Ссылка объясняет, что PIC является тем, как используется EBX.