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

Я написал "опасную" программу на 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.

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

2 ответов


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

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

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

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


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