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

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


i) Иногда он вызывает __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?

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


person Jiwon    schedule 15.08.2018    source источник


Ответы (1)


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

person fuz    schedule 15.08.2018
comment
Понятно.. Спасибо за ответ. - person Jiwon; 13.09.2018