Что это за таблица инструкций jmp к функциям, которую я всегда вижу при разборке вывода MSVC?

#assembly #visual-c #x86 #linker

#сборка #visual-c #x86 #компоновщик

Вопрос:

 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. Как она называется? Я хочу знать, что искать в Google.
  2. Почему она существует?
  3. Дополнительная информация: Могу ли я каким-либо образом запросить ее существование через Windows Debug API?

Комментарии:

1. Все эти функции определены в библиотеке инициализации C runtime. Кроме этого, трудно полностью ответить на вопрос, не описав точно, как мы можем воспроизвести эту таблицу.

2. Я вижу таблицу переходов для отладочных сборок, но не для релизных сборок. Мне непонятно, как наличие таблицы переходов помогает при отладочных сборках.

3. @rcgldr : Инкрементное связывание использует ее для исправления

4. Если эта таблица соответствует моим представлениям, в ней также должна быть куча байтов 0xcc для будущих записей thunk при добавлении новых функций. И если это то, что я думаю сейчас, этот вопрос можно закрыть как дублирующий, потому что есть похожие вопросы по SO.

5. @MichaelPetch — верно, но по умолчанию для сборок выпуска отключена инкрементная ссылка.