Что такое __i686.get_pc_thunk.bx?Зачем нам нужен этот звонок? - PullRequest
34 голосов
/ 13 июля 2011

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

call   0xf60d2f47 <__i686.get_pc_thunk.bx>.

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

Ответы [ 2 ]

46 голосов
/ 13 июля 2011

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

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

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

8 голосов
/ 14 мая 2015

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

Предположим, после того, как вы выполните disass на 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

...