Как компилятор выбрать, какую функцию "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 ответ
Компилятор выбирает соответствующую функцию для любого регистра, который он хочет использовать. Какой регистр используется, является результатом распределения регистров компилятором для функции, которую он компилирует, и, как правило, непредсказуемо.