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