Как компилятор выбрать, какую функцию "get_pc_thunk", чтобы получить текущий адрес?

Пирог двоичный использовать функцию __x86.get_pc_thunk получить адрес, динамически определенный во время загрузки.


я) Иногда это вызывает __x86.get_pc_thunk.ax,

5ff:   e8 24 00 00 00          call   628 <__x86.get_pc_thunk.ax>
604:   05 fc 19 00 00          add    $0x19fc,%eax
609:   83 ec 0c                sub    $0xc,%esp
60c:   8d 90 b0 e6 ff ff       lea    -0x1950(%eax),%edx
612:   52                      push   %edx
613:   89 c3                   mov    %eax,%ebx
615:   e8 36 fe ff ff          call   450 <printf@plt>


II) Иногда это вызывает __x86.get_pc_thunk.bx,

634:   e8 87 fe ff ff          call   4c0  <__x86.get_pc_thunk.bx>
639:   81 c3 c7 19 00 00       add    $0x19c7,%ebx
63f:   83 ec 0c                sub    $0xc,%esp
642:   8b 6c 24 20             mov    0x20(%esp),%ebp
646:   8d b3 f0 fe ff ff       lea    -0x110(%ebx),%esi
64c:   e8 cb fd ff ff          call   41c <_init>


iii) И иногда это вызывает __x86.get_pc_thunk.cx или иногда __x86.get_pc_thunk.dx,



Я знаю разницу между __x86.get_pc_thunk.bx а также __x86.get_pc_thunk.ax регистр, в котором хранится обратный адрес, .bx в EBX, .ax в EAX,


Тогда мой вопрос:

как компилятор выбирает какую функцию использовать __x86.get_pc_thunk.ax/__x86.get_pc_thunk.bx/__x86.get_pc_thunk.cx/__x86.get_pc_thunk.dx?

Действительно ли он выбран случайно во время компиляции?
Или есть какой-нибудь алгоритм для выбора этого?

1 ответ

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

Другие вопросы по тегам