Почему "символ @ GOT" не допускается на двоичном бинарном пироге? - PullRequest
0 голосов
/ 20 ноября 2018

Вот пример файла сборки, test.s

.global main  
main:  
 mov __progname@GOT, %eax         // failed to compile
 mov __progname@GOT(%ebx), %eax   //succeed to compile

Я попытался скомпилировать его с флагом -pie, но не удалось.

$ gcc -pie -o test test.s
osboxes@osboxes:/mnt/hgfs/VM_Shared/Reassemblabla/src$ gcc -pie -o test test.s
/usr/bin/ld: /tmp/ccPGMLlH.o: direct GOT relocation R_386_GOT32X against `__progname' without base register can not be used when making a shared object
/usr/bin/ld: failed to set dynamic section sizes: File format not recognized
collect2: error: ld returned 1 exit status

Сказана ошибка. В круговой двоичной записи доступ к записи GOT доступен только через базовый регистр.

Вопрос.
Я не знаю, почему компилятор жалуется, как указано выше.
В частности, почему адресация __progname@GOT не разрешена для двоичного кода пирога?



Мое мнение.
Загрузчик знает адрес __progname@GOT во время загрузки кругового двоичного файла.

Итак, загрузчик может просто написать этот адрес в месте __progname@GOT во время загрузки.
Это то, что загрузчик может сделать.

Поэтому я не могу понять, почему компилятор настаивает на доступе к регистру, например
mov __progname@GOT(%ebx), %eax.

1 Ответ

0 голосов
/ 20 ноября 2018

PIE должен использовать относительную к ПК адресацию;ia32 - дерьмо в этом, так что вам нужно сделать что-то вроде:

    call thunk
    add  $_GLOBAL_OFFSET_TABLE__, %eax
    mov  __progname@GOT(%eax), %eax
    ret
thunk:
    mov (%esp), %eax
    ret

Обратите внимание, что смещение от этого адреса программы к _GLOBAL_OFFSET_TABLE__ вычисляется по ссылке GOT.Таким образом, программа может быть загружена (в отличие от связанной или расположенной) по любому адресу и найдет GOT и все переменные, поскольку относительное смещение одинаково.Для справки, приведенная выше версия amd64 выглядит примерно так:

mov    __progname(%rip), %rax
ret

Обратите внимание, что оба они сохраняют текст "чистым" ....

...