Что означает здесь документация NASM GOT? - PullRequest
0 голосов
/ 22 апреля 2019

Я читаю этот раздел здесь, начиная с раздела 9.2: https://www.nasm.us/xdoc/2.14.02/html/nasmdoc8.html#section-8.4

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

Тем не менее я верю, что они продолжают говорить:

        call    .get_GOT 
.get_GOT: 
        pop     ebx 
        add     ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc 

достигает с помощью GOT, сначала помещая значение ebx в стек, где .get_GOT помещает местоположение GOT относительно регистра rip и возвращает его в ebx.

Это все, что, я думаю, я правильно понял. Если кто-нибудь может уточнить, что происходит в этом

add     ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc 

Я был бы очень признателен. Также, пожалуйста, разбейте его на разделы, касающиеся всей части второго операнда в этой инструкции добавления. Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2019

У меня проблемы с пониманием всего контекста.

CALL x эквивалентно PUSH RIP, JMP x

Итак, в следующей инструкции вы получите текущий RIP.

Примечание: этот код передается компоновщику, поэтому компоновщик считывает код и вводит правильный адрес CALL, но NASM не может знать такой адрес во время сборки.

Последняя инструкция - ADD: мы добавляем EBX к константе. Да, константа будет вычислена во время сборки.

Нам не хватает информации для подробностей, но, как вы видите, мы добавляем из RIP (в ebx) смещение.

$$ соответствует началу текущего раздела; раздел 3.5

Для оператора wrt: section 7.6 , и, вероятно, этот раздел объяснит намного лучше код, который вы ищете.

У меня слишком много ржавчины на NASM, чтобы идти дальше.

...