Fix PDB virtual functions recognition in analysis (#6472)

Co-authored-by: Anton Kochkov <anton.kochkov@gmail.com>
This commit is contained in:
NOT XVilka 2026-06-10 11:55:21 +08:00 committed by GitHub
parent f19a29442b
commit ac388acdeb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 120 additions and 63 deletions

View file

@ -563,6 +563,12 @@ static inline bool jumps_to_prelude(RzAnalysis *analysis, ut64 jmp_addr) {
static inline bool jump_leaves_mapped_mem(RzAnalysis *analysis, ut64 insn_addr, ut64 jump_target) {
rz_return_val_if_fail(analysis, false);
RzIOMap *map = analysis->iob.map_get(analysis->iob.io, insn_addr);
if (!map) {
// The instruction itself is not part of any mapped region (e.g. analysis
// walked into a hole of a sparse address space such as a crash dump).
// Treat the jump as leaving mapped memory so we stop following it.
return true;
}
return (jump_target < map->itv.addr || jump_target >= map->itv.addr + map->itv.size);
}

View file

@ -214,7 +214,7 @@ static void rz_core_bin_pdb_gvars_print(RzPdb *pdb, const ut64 baddr, RzCmdState
}
typedef struct {
const RzCore *core;
RzCore *core;
const ut64 baddr;
const char *file;
} PDBLoadContext;
@ -287,8 +287,53 @@ static bool symbol_load(RzPdb *pdb, const PDBSymbol *symbol, void *u) {
return true;
}
/**
* \brief Second-pass callback that turns PDB public function symbols into
* analyzed functions.
*
* The PDB explicitly marks public symbols that are functions (cvpsfFunction).
* Some of these (e.g. virtual methods only reached through a vtable) are never
* discovered by call-following code analysis, so without this they would be
* present only as a flag and never show up as a function. This mirrors how
* \ref rz_core_analysis_all turns FUNC bin symbols into functions: it triggers
* analysis at the address and lets the already-set PDB flag name the function.
*
* This must run after all symbol flags have been set (see \ref pdb_symbols_load)
* so that functions reached by direct calls from here are also named correctly.
*/
static bool symbol_make_function(RzPdb *pdb, const PDBSymbol *symbol, void *u) {
if (!symbol || symbol->kind != PDB_Public) {
return true;
}
const PDBSPublic *public = symbol->data;
if (!public || !public->function || RZ_STR_ISEMPTY(public->name)) {
return true;
}
PDBLoadContext *ctx = u;
RzCore *core = ctx->core;
ut64 addr = rz_bin_pdb_to_rva(pdb, &public->offset);
if (addr == UT64_MAX) {
return true;
}
if (ctx->baddr != UT64_MAX) {
addr += ctx->baddr;
}
// Only create functions where executable code is actually mapped. This also
// keeps the symbol info (flags, types, globals) usable when no backing
// binary is loaded, since in that case no function will be created.
if (!rz_io_is_valid_offset(core->io, addr, RZ_PERM_X)) {
return true;
}
if (rz_analysis_get_function_at(core->analysis, addr)) {
return true;
}
int depth = rz_config_get_i(core->config, "analysis.depth");
rz_core_analysis_fcn(core, addr, UT64_MAX, RZ_ANALYSIS_XREF_TYPE_NULL, depth);
return true;
}
static void pdb_symbols_load(
const RzCore *core, RzPdb *pdb, const char *pdbfile) {
RzCore *core, RzPdb *pdb, const char *pdbfile) {
rz_return_if_fail(core && pdb);
if (!(pdb->s_pe && pdb->s_gdata)) {
return;
@ -309,6 +354,12 @@ static void pdb_symbols_load(
rz_pdb_all_symbols_foreach(pdb, symbol_load, &ctx);
rz_flag_space_pop(core->flags);
// Create functions for public function symbols in a separate pass, after
// every symbol flag has been set, so each function (and any function it
// directly calls) is named from its PDB flag.
rz_pdb_all_symbols_foreach(pdb, symbol_make_function, &ctx);
free(file);
}

View file

@ -7,8 +7,20 @@ fi 1 @ 0x00401010
EOF
EXPECT=<<EOF
0x00401000 4096 section..text
0x00401000 0 pdb.SimplePDB.void___cdecl_SomeCoolFunction_void
0x00401010 0 pdb.SimplePDB._main
0x00401000 13 pdb.SimplePDB.void___cdecl_SomeCoolFunction_void
0x00401010 8 pdb.SimplePDB._main
EOF
RUN
NAME=idp creates functions for public function symbols
FILE=bins/pdb/vs2019_cpp_override.exe
CMDS=<<EOF
idp bins/pdb/vs2019_cpp_override.pdb
aflq~Foo,Bar
EOF
EXPECT=<<EOF
0x00401000 pdb.vs2019_cpp_override.public_virtual:_int___thiscall_CTest1::Foo_void_const
0x00401040 pdb.vs2019_cpp_override.public_virtual:_int___thiscall_CTest2::Bar_void_const
EOF
RUN

View file

@ -175,42 +175,42 @@ mov qword [rsp+0x08], rcx
mov qword [rsp+0x10], rdx
mov qword [rsp+0x18], r8
mov qword [rsp+0x20], r9
0 0xfffff8047bdf5a80 sp: 0xffff850429890ee8 0 [??] pdb.ntkrnlmp.KeBugCheckEx
0 0xfffff8047bdf5a80 sp: 0xffff850429890ee8 0 [pdb.ntkrnlmp.KeBugCheckEx] pdb.ntkrnlmp.KeBugCheckEx
1 0xfffff8047be0f4e1 sp: 0xffff850429890ef0 56 [??] pdb.ntkrnlmp.string_::3655334267::_Kernel_MUI_Lang_::1575215452+5649
2 0xfffff8047bdcc052 sp: 0xffff850429890f30 104 [??] pdb.ntkrnlmp.__C_specific_handler+162
3 0xfffff8047bdfe942 sp: 0xffff850429890fa0 40 [??] pdb.ntkrnlmp.RtlpExecuteHandlerForException+18
2 0xfffff8047bdcc052 sp: 0xffff850429890f30 104 [pdb.ntkrnlmp.__C_specific_handler] pdb.ntkrnlmp.__C_specific_handler+162
3 0xfffff8047bdfe942 sp: 0xffff850429890fa0 40 [pdb.ntkrnlmp.RtlpExecuteHandlerForException] pdb.ntkrnlmp.RtlpExecuteHandlerForException+18
4 0xfffff8047bd2bf97 sp: 0xffff850429890fd0 1816 [??] pdb.ntkrnlmp.RtlDispatchException+663
5 0xfffff8047bd2ab86 sp: 0xffff8504298916f0 1720 [??] pdb.ntkrnlmp.KiDispatchException+390
6 0xfffff8047be07bac sp: 0xffff850429891db0 472 [??] pdb.ntkrnlmp.KiExceptionDispatch+300
7 0xfffff8047be031f5 sp: 0xffff850429891f90 400 [??] pdb.ntkrnlmp.KiSegmentNotPresentFault+821
8 0xfffff8048b58334c sp: 0xffff850429892120 40 [??] pdb.amdppm.WriteIoMemRawEx+112
9 0xfffff8048b58313f sp: 0xffff850429892150 40 [??] pdb.amdppm.WriteGenAddrEx+107
10 0xfffff8048b583234 sp: 0xffff850429892180 40 [??] pdb.amdppm.WriteGenAddrMaybeHiddenEx+24
11 0xfffff8048b5a0e8f sp: 0xffff8504298921b0 88 [??] pdb.amdppm.InitAcpiCpc+791
12 0xfffff8048b5a83f6 sp: 0xffff850429892210 296 [??] pdb.amdppm.ProcLibDeviceStart+2182
13 0xfffff8048b59f852 sp: 0xffff850429892340 56 [??] pdb.amdppm.EvtDevicePrepareHardware+210
14 0xfffff804799cc027 sp: 0xffff850429892380 72 [??] pdb.Wdf01000.protected_virtual:_long_int___cdecl_FxPnpDevicePrepareHardware::InvokeClient_void____ptr64+39
15 0xfffff80479966f81 sp: 0xffff8504298923d0 56 [??] pdb.Wdf01000.public:_long_int___cdecl_FxPrePostCallback::InvokeStateful_enum_FxCxCallbackProgress_____ptr64__enum_FxCxCallbackCleanupAction____ptr64+105
16 0xfffff804799cb227 sp: 0xffff850429892410 72 [??] pdb.Wdf01000.protected:_long_int___cdecl_FxPkgPnp::PnpPrepareHardware_unsigned_char_____ptr64__enum_FxCxCallbackProgress_____ptr64____ptr64+223
17 0xfffff804799c9e21 sp: 0xffff850429892460 56 [??] pdb.Wdf01000.protected:_static_enum__WDF_DEVICE_PNP_STATE___cdecl_FxPkgPnp::PnpEventHardwareAvailable_class_FxPkgPnp_____ptr64+81
18 0xfffff804799c99da sp: 0xffff8504298924a0 136 [??] pdb.Wdf01000.protected:_void___cdecl_FxPkgPnp::PnpEnterNewState_enum__WDF_DEVICE_PNP_STATE____ptr64+350
19 0xfffff804799cb6b1 sp: 0xffff850429892530 104 [??] pdb.Wdf01000.protected:_void___cdecl_FxPkgPnp::PnpProcessEventInner_struct_FxPostProcessInfo_____ptr64____ptr64+465
20 0xfffff804799cb47a sp: 0xffff8504298925a0 136 [??] pdb.Wdf01000.public:_void___cdecl_FxPkgPnp::PnpProcessEvent_enum_FxPnpEvent__unsigned_char____ptr64+386
21 0xfffff804799d299e sp: 0xffff850429892630 40 [??] pdb.Wdf01000.protected:_static_long_int___cdecl_FxPkgPnp::_PnpStartDevice_class_FxPkgPnp_____ptr64__class_FxIrp_____ptr64+30
22 0xfffff8047995cc5f sp: 0xffff850429892660 104 [??] pdb.Wdf01000.protected_virtual:_long_int___cdecl_FxPkgPnp::Dispatch_struct__IRP_____ptr64____ptr64+175
23 0xfffff8047995a866 sp: 0xffff8504298926d0 88 [??] pdb.Wdf01000.public:_static_long_int___cdecl_FxDevice::DispatchWithLock_struct__DEVICE_OBJECT_____ptr64__struct__IRP_____ptr64+342
24 0xfffff8047bc52f55 sp: 0xffff850429892730 56 [??] pdb.ntkrnlmp.IofCallDriver+85
25 0xfffff8047c1548a6 sp: 0xffff850429892770 56 [??] pdb.ntkrnlmp.PnpAsynchronousCall+234
26 0xfffff8047bce0d1e sp: 0xffff8504298927b0 104 [??] pdb.ntkrnlmp.PnpSendIrp+158
27 0xfffff8047bd6ab7c sp: 0xffff850429892820 136 [??] pdb.ntkrnlmp.PnpStartDevice+136
28 0xfffff8047c123760 sp: 0xffff8504298928b0 136 [??] pdb.ntkrnlmp.PnpStartDeviceNode+236
29 0xfffff8047c12362f sp: 0xffff850429892940 72 [??] pdb.ntkrnlmp.PipProcessStartPhase1+115
30 0xfffff8047c126bdd sp: 0xffff850429892990 200 [??] pdb.ntkrnlmp.PipProcessDevNodeTree+793
31 0xfffff8047c1bdf0c sp: 0xffff850429892a60 72 [??] pdb.ntkrnlmp.PiProcessStartSystemDevices+96
32 0xfffff8047bd6c2ec sp: 0xffff850429892ab0 184 [??] pdb.ntkrnlmp.PnpDeviceActionWorker+1228
33 0xfffff8047bc25975 sp: 0xffff850429892b70 152 [??] pdb.ntkrnlmp.ExpWorkerThread+261
34 0xfffff8047bd17e25 sp: 0xffff850429892c10 72 [??] pdb.ntkrnlmp.PspSystemThreadStartup+85
35 0xfffff8047bdfd0d8 sp: 0xffff850429892c60 40 [??] pdb.ntkrnlmp.KiStartSystemThread+40
5 0xfffff8047bd2ab86 sp: 0xffff8504298916f0 1720 [pdb.ntkrnlmp.KiDispatchException] pdb.ntkrnlmp.KiDispatchException+390
6 0xfffff8047be07bac sp: 0xffff850429891db0 472 [pdb.ntkrnlmp.KiExceptionDispatch] pdb.ntkrnlmp.KiExceptionDispatch+300
7 0xfffff8047be031f5 sp: 0xffff850429891f90 400 [pdb.ntkrnlmp.KiSegmentNotPresentFault] pdb.ntkrnlmp.KiSegmentNotPresentFault+821
8 0xfffff8048b58334c sp: 0xffff850429892120 40 [pdb.amdppm.WriteIoMemRawEx] pdb.amdppm.WriteIoMemRawEx+112
9 0xfffff8048b58313f sp: 0xffff850429892150 40 [pdb.amdppm.WriteGenAddrEx] pdb.amdppm.WriteGenAddrEx+107
10 0xfffff8048b583234 sp: 0xffff850429892180 40 [pdb.amdppm.WriteGenAddrMaybeHiddenEx] pdb.amdppm.WriteGenAddrMaybeHiddenEx+24
11 0xfffff8048b5a0e8f sp: 0xffff8504298921b0 88 [pdb.amdppm.InitAcpiCpc] pdb.amdppm.InitAcpiCpc+791
12 0xfffff8048b5a83f6 sp: 0xffff850429892210 296 [pdb.amdppm.ProcLibDeviceStart] pdb.amdppm.ProcLibDeviceStart+2182
13 0xfffff8048b59f852 sp: 0xffff850429892340 56 [pdb.amdppm.EvtDevicePrepareHardware] pdb.amdppm.EvtDevicePrepareHardware+210
14 0xfffff804799cc027 sp: 0xffff850429892380 72 [pdb.Wdf01000.protected_virtual:_long_int___cdecl_FxPnpDevicePrepareHardware::InvokeClient_void____ptr64] pdb.Wdf01000.protected_virtual:_long_int___cdecl_FxPnpDevicePrepareHardware::InvokeClient_void____ptr64+39
15 0xfffff80479966f81 sp: 0xffff8504298923d0 56 [pdb.Wdf01000.public:_long_int___cdecl_FxPrePostCallback::InvokeStateful_enum_FxCxCallbackProgress_____ptr64__enum_FxCxCallbackCleanupAction____ptr64] pdb.Wdf01000.public:_long_int___cdecl_FxPrePostCallback::InvokeStateful_enum_FxCxCallbackProgress_____ptr64__enum_FxCxCallbackCleanupAction____ptr64+105
16 0xfffff804799cb227 sp: 0xffff850429892410 72 [pdb.Wdf01000.protected:_long_int___cdecl_FxPkgPnp::PnpPrepareHardware_unsigned_char_____ptr64__enum_FxCxCallbackProgress_____ptr64____ptr64] pdb.Wdf01000.protected:_long_int___cdecl_FxPkgPnp::PnpPrepareHardware_unsigned_char_____ptr64__enum_FxCxCallbackProgress_____ptr64____ptr64+223
17 0xfffff804799c9e21 sp: 0xffff850429892460 56 [pdb.Wdf01000.protected:_static_enum__WDF_DEVICE_PNP_STATE___cdecl_FxPkgPnp::PnpEventHardwareAvailable_class_FxPkgPnp_____ptr64] pdb.Wdf01000.protected:_static_enum__WDF_DEVICE_PNP_STATE___cdecl_FxPkgPnp::PnpEventHardwareAvailable_class_FxPkgPnp_____ptr64+81
18 0xfffff804799c99da sp: 0xffff8504298924a0 136 [pdb.Wdf01000.protected:_void___cdecl_FxPkgPnp::PnpEnterNewState_enum__WDF_DEVICE_PNP_STATE____ptr64] pdb.Wdf01000.protected:_void___cdecl_FxPkgPnp::PnpEnterNewState_enum__WDF_DEVICE_PNP_STATE____ptr64+350
19 0xfffff804799cb6b1 sp: 0xffff850429892530 104 [pdb.Wdf01000.protected:_void___cdecl_FxPkgPnp::PnpProcessEventInner_struct_FxPostProcessInfo_____ptr64____ptr64] pdb.Wdf01000.protected:_void___cdecl_FxPkgPnp::PnpProcessEventInner_struct_FxPostProcessInfo_____ptr64____ptr64+465
20 0xfffff804799cb47a sp: 0xffff8504298925a0 136 [pdb.Wdf01000.public:_void___cdecl_FxPkgPnp::PnpProcessEvent_enum_FxPnpEvent__unsigned_char____ptr64] pdb.Wdf01000.public:_void___cdecl_FxPkgPnp::PnpProcessEvent_enum_FxPnpEvent__unsigned_char____ptr64+386
21 0xfffff804799d299e sp: 0xffff850429892630 40 [pdb.Wdf01000.protected:_static_long_int___cdecl_FxPkgPnp::_PnpStartDevice_class_FxPkgPnp_____ptr64__class_FxIrp_____ptr64] pdb.Wdf01000.protected:_static_long_int___cdecl_FxPkgPnp::_PnpStartDevice_class_FxPkgPnp_____ptr64__class_FxIrp_____ptr64+30
22 0xfffff8047995cc5f sp: 0xffff850429892660 104 [pdb.Wdf01000.protected_virtual:_long_int___cdecl_FxPkgPnp::Dispatch_struct__IRP_____ptr64____ptr64] pdb.Wdf01000.protected_virtual:_long_int___cdecl_FxPkgPnp::Dispatch_struct__IRP_____ptr64____ptr64+175
23 0xfffff8047995a866 sp: 0xffff8504298926d0 88 [pdb.Wdf01000.public:_static_long_int___cdecl_FxDevice::DispatchWithLock_struct__DEVICE_OBJECT_____ptr64__struct__IRP_____ptr64] pdb.Wdf01000.public:_static_long_int___cdecl_FxDevice::DispatchWithLock_struct__DEVICE_OBJECT_____ptr64__struct__IRP_____ptr64+342
24 0xfffff8047bc52f55 sp: 0xffff850429892730 56 [pdb.ntkrnlmp.IofCallDriver] pdb.ntkrnlmp.IofCallDriver+85
25 0xfffff8047c1548a6 sp: 0xffff850429892770 56 [pdb.ntkrnlmp.PnpAsynchronousCall] pdb.ntkrnlmp.PnpAsynchronousCall+234
26 0xfffff8047bce0d1e sp: 0xffff8504298927b0 104 [pdb.ntkrnlmp.PnpSendIrp] pdb.ntkrnlmp.PnpSendIrp+158
27 0xfffff8047bd6ab7c sp: 0xffff850429892820 136 [pdb.ntkrnlmp.PnpStartDevice] pdb.ntkrnlmp.PnpStartDevice+136
28 0xfffff8047c123760 sp: 0xffff8504298928b0 136 [pdb.ntkrnlmp.PnpStartDeviceNode] pdb.ntkrnlmp.PnpStartDeviceNode+236
29 0xfffff8047c12362f sp: 0xffff850429892940 72 [pdb.ntkrnlmp.PipProcessStartPhase1] pdb.ntkrnlmp.PipProcessStartPhase1+115
30 0xfffff8047c126bdd sp: 0xffff850429892990 200 [pdb.ntkrnlmp.PipProcessDevNodeTree] pdb.ntkrnlmp.PipProcessDevNodeTree+793
31 0xfffff8047c1bdf0c sp: 0xffff850429892a60 72 [pdb.ntkrnlmp.PiProcessStartSystemDevices] pdb.ntkrnlmp.PiProcessStartSystemDevices+96
32 0xfffff8047bd6c2ec sp: 0xffff850429892ab0 184 [pdb.ntkrnlmp.PnpDeviceActionWorker] pdb.ntkrnlmp.PnpDeviceActionWorker+1228
33 0xfffff8047bc25975 sp: 0xffff850429892b70 152 [pdb.ntkrnlmp.ExpWorkerThread] pdb.ntkrnlmp.ExpWorkerThread+261
34 0xfffff8047bd17e25 sp: 0xffff850429892c10 72 [pdb.ntkrnlmp.PspSystemThreadStartup] pdb.ntkrnlmp.PspSystemThreadStartup+85
35 0xfffff8047bdfd0d8 sp: 0xffff850429892c60 40 [pdb.ntkrnlmp.KiStartSystemThread] pdb.ntkrnlmp.KiStartSystemThread+40
36 0x0 sp: 0xffff850429892c90 0 [??]
EOF
RUN
@ -369,10 +369,10 @@ int3
ret
int3
int3
0 0xfffff805108776a0 sp: 0xfffff805135684f8 0 [??] pdb.ntkrnlmp.RtlpBreakWithStatusInstruction
1 0xfffff805110dd222 sp: 0xfffff80513568500 568 [??] pdb.ntkrnlmp.string_::2500419057::__Device_Ramdisk_::253687359+25426
2 0xfffff80510c50204 sp: 0xfffff80513568740 776 [??] pdb.ntkrnlmp.KiInitializeKernel+1364
3 0xfffff80510c45219 sp: 0xfffff80513568a50 1448 [??] pdb.ntkrnlmp.KiSystemStartup+521
0 0xfffff805108776a0 sp: 0xfffff805135684f8 0 [pdb.ntkrnlmp.RtlpBreakWithStatusInstruction] pdb.ntkrnlmp.RtlpBreakWithStatusInstruction
1 0xfffff805110dd222 sp: 0xfffff80513568500 568 [pdb.ntkrnlmp.InitBootProcessor] loc.fffff805110dc832+2544
2 0xfffff80510c50204 sp: 0xfffff80513568740 776 [pdb.ntkrnlmp.KiSetFeatureBits] pdb.ntkrnlmp.KiInitializeKernel+1364
3 0xfffff80510c45219 sp: 0xfffff80513568a50 1448 [pdb.ntkrnlmp.KiSystemStartup] pdb.ntkrnlmp.KiSystemStartup+521
4 0x0 sp: 0xfffff80513569000 0 [??]
1 fd: 4 +0x0000a038 0x00001000 - 0x00014fff r-- fmap.page.0x1000
2 fd: 4 +0x0001e038 0x00017000 - 0x00018fff r-- fmap.page.0x17000

View file

@ -173,33 +173,21 @@ global void * __guard_dispatch_icall_fptr @ 0x140015020
global void * __guard_xfg_dispatch_icall_fptr @ 0x140015030
global void * __guard_xfg_table_dispatch_icall_fptr @ 0x140015040
---
(nofunc) 0x140007344 [DATA] lea rcx, qword pdb.exceptions_test.__guard_check_icall_fptr
0x140007344 lea rcx, qword pdb.exceptions_test.__guard_check_icall_fptr ; 0x140015000
0x14000734b call fcn.1400011db
0x140007350 lea rcx, qword [0x14000101e]
fcn.140001366 0x140006a64 [DATA] mov dword [pdb.exceptions_test.__scrt_debugger_hook_flag], 0x00
; CALL XREFS from fcn.140001398 @ 0x140006aab, 0x140006c04
pdb.exceptions_test._guard_icall_checks_enforced 0x140007344 [DATA] lea rcx, qword pdb.exceptions_test.__guard_check_icall_fptr
| 0x140007344 lea rcx, qword pdb.exceptions_test.__guard_check_icall_fptr ; 0x140015000 ; int64_t arg1
| 0x14000734b call fcn.1400011db
| 0x140007350 lea rcx, qword data.14000101e ; 0x14000101e
pdb.exceptions_test.__crt_debugger_hook 0x140006a64 [DATA] mov dword [pdb.exceptions_test.__scrt_debugger_hook_flag], 0x00
; CALL XREFS from pdb.exceptions_test.__scrt_fastfail @ 0x140006aab, 0x140006c04
/ fcn.140001366(int64_t arg1);
| ; arg int64_t arg1 @ rcx
| ; var int64_t var_8h @ stack + 0x8
| 0x140001366 jmp pdb.exceptions_test.__crt_debugger_hook
\ 0x140001366 jmp pdb.exceptions_test.__crt_debugger_hook
| ----------- true: 0x140006a60
| ; CODE XREF from fcn.140001366 @ 0x140001366
| ;-- __crt_debugger_hook:
| 0x140006a60 mov dword [var_8h], ecx ; arg1
| 0x140006a64 mov dword [pdb.exceptions_test.__scrt_debugger_hook_flag], 0x00 ; [0x140011ba4:4]=0
\ 0x140006a6e ret
fcn.140001316 0x140006a40 [DATA] lea rax, qword pdb.exceptions_test.__dyn_tls_init_callback
pdb.exceptions_test.__scrt_get_dyn_tls_init_callback 0x140006a40 [DATA] lea rax, qword pdb.exceptions_test.__dyn_tls_init_callback
; CALL XREF from fcn.1400049a0 @ 0x140004a44
/ fcn.140001316();
| 0x140001316 jmp pdb.exceptions_test.__scrt_get_dyn_tls_init_callback
\ 0x140001316 jmp pdb.exceptions_test.__scrt_get_dyn_tls_init_callback
| ----------- true: 0x140006a40
| ; CODE XREF from fcn.140001316 @ 0x140001316
| ;-- __scrt_get_dyn_tls_init_callback:
| 0x140006a40 lea rax, qword pdb.exceptions_test.__dyn_tls_init_callback ; 0x140011be0
\ 0x140006a47 ret
EOF
RUN