В дополнение к принятому ответу. Одна вещь, которая сильно влияет на производительность кода PIC - это отсутствие «относительной IP-адресации» на x86. С помощью «IP относительной адресации» вы можете запросить данные, которые составляют X байтов из текущего указателя инструкции. Это сделало бы код PIC намного проще.
Прыжки и вызовы, как правило, относительны к EIP, поэтому они не представляют проблемы Однако для доступа к данным потребуется немного больше хитрости. Иногда регистр будет временно зарезервирован как «базовый указатель» на данные, необходимые для кода. Например, распространенным методом является злоупотребление работой вызовов на x86:
call label_1
.dd 0xdeadbeef
.dd 0xfeedf00d
.dd 0x11223344
label_1:
pop ebp ; now ebp holds the address of the first dataword
; this works because the call pushes the **next**
; instructions address
; real code follows
mov eax, [ebp + 4] ; for example i'm accessing the '0xfeedf00d' in a PIC way
Этот и другие методы добавляют слой косвенности к доступу к данным. Например, GOT (Глобальная таблица смещений), используемая компиляторами gcc.
x86-64 добавлен режим «RIP относительный», который упрощает lot .