Подтвердить что ты не робот

Что такое __i686.get_pc_thunk.bx? Зачем нам этот звонок?

Когда я разбираю свою небольшую функцию, мне довелось увидеть этот вызов

call   0xf60d2f47 <__i686.get_pc_thunk.bx>.

Я не знаю, зачем мне этот вызов в моей программе. Любое объяснение было бы полезно.

4b9b3361

Ответ 1

Этот вызов используется в независимом от позиции коде на x86. Он загружает позицию кода в регистр %ebx, который позволяет глобальным объектам (которые имеют фиксированное смещение от кода) к доступу в качестве смещения от этого регистра.

Независимый от позиции код - это код, который может быть загружен и выполнен без изменений, с разными адресами. Это важно для кода, который будет связан с разделяемыми библиотеками, поскольку они могут отображаться на другом адресе в разных процессах.

Обратите внимание, что эквивалентный вызов не требуется на x86-64, поскольку эта архитектура имеет режимы IP-относительной адресации (то есть, она может непосредственно адресовать ячейки памяти как смещение от местоположения текущей команды).

Ответ 2

Добавление дополнительной информации к примеру:

Предположим, что после того, как вы отключите функцию запуска внутри функции gdb, вы найдете что-то вроде этого:

0x012c17a3  <startup+7>:     call   0x12b2ce7 <__i686.get_pc_thunk.bx>
0x012c17a8 <startup+12>:     add    $0x10d6518,%ebx

Затем после того, как вы вызвали __i686.get_pc_thunk.bx, регистр ebx будет заполнен значением 0x012c17a8, который является адресом следующей инструкции.

Вы можете прочитать функцию как get_pc (счетчик программ).

Я нашел эту статью очень приятной для лучшего понимания:

https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html