#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.
Моя теория заключается в том, что это помогает компоновщику для таких вещей, как редактирование и продолжение, потому что тогда компоновщик может выгрузить новую функцию в любом месте области памяти, а затем просто исправить эту таблицу переходов в новое местоположение. Но у меня сейчас не включены редактирование и продолжение, и я все еще иногда вижу это, когда включено достаточное количество оптимизаций.
- Как она называется? Я хочу знать, что искать в Google.
- Почему она существует?
- Дополнительная информация: Могу ли я каким-либо образом запросить ее существование через Windows Debug API?
Комментарии:
1. Все эти функции определены в библиотеке инициализации C runtime. Кроме этого, трудно полностью ответить на вопрос, не описав точно, как мы можем воспроизвести эту таблицу.
2. Я вижу таблицу переходов для отладочных сборок, но не для релизных сборок. Мне непонятно, как наличие таблицы переходов помогает при отладочных сборках.
3. @rcgldr : Инкрементное связывание использует ее для исправления
4. Если эта таблица соответствует моим представлениям, в ней также должна быть куча байтов 0xcc для будущих записей thunk при добавлении новых функций. И если это то, что я думаю сейчас, этот вопрос можно закрыть как дублирующий, потому что есть похожие вопросы по SO.
5. @MichaelPetch — верно, но по умолчанию для сборок выпуска отключена инкрементная ссылка.