Что это за таблица инструкций jmp для функций, которые я всегда вижу при разборке выходных данных MSVC? - PullRequest
3 голосов
/ 14 марта 2019
00007FF755AF1118  jmp         __scrt_get_dyn_tls_init_callback (07FF755AF2730h)  
__scrt_dllmain_crt_thread_attach:
00007FF755AF111D  jmp         __scrt_dllmain_crt_thread_attach (07FF755AF1E90h)  
__acrt_thread_attach:
00007FF755AF1122  jmp         __scrt_stub_for_acrt_thread_attach (07FF755AF4F30h)  
__acrt_thread_detach:
00007FF755AF1127  jmp         __scrt_stub_for_acrt_thread_detach (07FF755AF4F40h)  
__crt_fast_decode_pointer<void (__cdecl** __ptr64)(void)>:
00007FF755AF112C  jmp         __crt_fast_decode_pointer<void (__cdecl**)(void)> (07FF755AF1B20h)  
__report_rangecheckfailure:
00007FF755AF1131  jmp         __report_rangecheckfailure (07FF755AF49A0h)  
__scrt_initialize_default_local_stdio_options:
00007FF755AF1136  jmp         __scrt_initialize_default_local_stdio_options (07FF755AF26A0h)  
__scrt_exe_initialize_mta:
00007FF755AF113B  jmp         __scrt_stub_for_initialize_mta (07FF755AF2B00h)  
f:
00007FF755AF1140  jmp         f (07FF755AF1490h)  
__scrt_get_dyn_tls_dtor_callback:
00007FF755AF1145  jmp         __scrt_get_dyn_tls_dtor_callback (07FF755AF2740h)  
__scrt_acquire_startup_lock:
00007FF755AF114A  jmp         __scrt_acquire_startup_lock (07FF755AF1DA0h)  
ReadNoFence64:
00007FF755AF114F  jmp         ReadNoFence64 (07FF755AF2C70h)  
_guard_icall_checks_enforced:
00007FF755AF1154  jmp         _guard_icall_checks_enforced (07FF755AF2CC0h)  
ReadPointerNoFence:
00007FF755AF1159  jmp         ReadPointerNoFence (07FF755AF2CA0h)  
__acrt_thread_attach:
00007FF755AF115E  jmp         __scrt_stub_for_acrt_thread_attach (07FF755AF4F30h)  
__scrt_exe_initialize_mta:
00007FF755AF1163  jmp         __scrt_stub_for_initialize_mta (07FF755AF2B00h)  
__scrt_unhandled_exception_filter:
00007FF755AF1168  jmp         __scrt_unhandled_exception_filter (07FF755AF2B10h)  
... etc etc this table is huge.

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

  1. Как это называется? Я хочу знать, что гуглить.
  2. Почему он существует?
  3. Дополнительный кредит: Могу ли я как-то запросить его существование через API отладки Windows ?
...