Что такое __i686.get_pc_thunk.bx? Зачем нам этот звонок?
Когда я разбираю свою небольшую функцию, мне довелось увидеть этот вызов
call 0xf60d2f47 <__i686.get_pc_thunk.bx>.
Я не знаю, зачем мне этот вызов в моей программе. Любое объяснение было бы полезно.
Ответ 1
Этот вызов используется в независимом от позиции коде на x86. Он загружает позицию кода в регистр %ebx, который позволяет глобальным объектам (которые имеют фиксированное смещение от кода) к доступу в качестве смещения от этого регистра.
Независимый от позиции код - это код, который может быть загружен и выполнен без изменений, с разными адресами. Это важно для кода, который будет связан с разделяемыми библиотеками, поскольку они могут отображаться на другом адресе в разных процессах.
Обратите внимание, что эквивалентный вызов не требуется на x86-64, поскольку эта архитектура имеет режимы IP-относительной адресации (то есть, она может непосредственно адресовать ячейки памяти как смещение от местоположения текущей команды).
Ответ 2
Добавление дополнительной информации к примеру:
Предположим, что после того, как вы отключите функцию запуска внутри функции gdb, вы найдете что-то вроде этого:
Затем после того, как вы вызвали __i686.get_pc_thunk.bx, регистр ebx будет заполнен значением 0x012c17a8, который является адресом следующей инструкции.
Вы можете прочитать функцию как get_pc (счетчик программ).
Я нашел эту статью очень приятной для лучшего понимания: