c++ - Initialize before any global objects -
i writing c++ memory profiler.
as knows, executable program may contain many global objects, , dll modules may contain global objects well. these global objects initialized crt initialization - after entry point , before winmain; dlls, entry point _dllmaincrtstartup, before dllmain, global objects of dll initialized.
a global object may allocate memory. memory profiler must initialized before global object initialization. after doing lot of researching, found not easy job.
one idea using createprocess create_suspended flag - try first chance. after that, use createremotethread call loadlibrary in target process load injection dll, , initialize dll. doesn't work because load implicit-linking dlls of executable program first. maybe createremotethread triggers behavior?
so, how first chance?
there might way otherwise using platform-specific ways, 1 way solve issue combine lazy initialization dylib loading.
for example, memory allocator functions exported this:
api void* exported_alloc(); api void exported_free(void* mem);
... inside dylib called mem.dll
.
in case, ensure of other dylibs can when being loaded, can create central statically-linked library (ex: sdk.lib) of dylibs link against header so:
#ifndef memory_h #define memory_h // memory.h void* my_alloc(); void my_free(void* mem); #endif
... can implement so:
static void* (exported_alloc)() = 0; static void (exported_free)(void* mem) = 0; static void initialize() { if (!exported_alloc) { // load 'mem.dll' (ex: 'loadlibrary') , // symbols `exported_alloc` , `exported_free` // (ex: getprocaddress). } } void* my_alloc() { initialize(); return exported_alloc(); } void my_free(void* mem) { initialize(); exported_free(mem); }
.. call freelibrary
@ appropriate time when you're finished dll. incurs bit of run-time overhead (similar overhead of accessing singleton), cross-platform solution (provided have cross-platform means of loading/unloading dylibs/shared libs @ runtime).
with solution, of dlls allocating memory @ global scope load mem.dll
prior performing memory allocations in lazy-initialized kind of way, ensuring have access memory functions @ appropriate time.
Comments
Post a Comment