diff --git a/CMakeLists.txt b/CMakeLists.txt
index 30a6b3e8..ebd02b20 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,6 +89,11 @@ if (NOT CMAKE_BUILD_TYPE)
endif()
endif()
+if (CMAKE_GENERATOR MATCHES "^Visual Studio.*$")
+ message(STATUS "Note: when building with Visual Studio the build type is specified when building.")
+ message(STATUS "For example: 'cmake --build . --config=Release")
+endif()
+
if("${CMAKE_BINARY_DIR}" MATCHES ".*(S|s)ecure$")
message(STATUS "Default to secure build")
set(MI_SECURE "ON")
@@ -327,11 +332,11 @@ set(MI_OPT_ARCH_FLAGS "")
set(MI_ARCH "unknown")
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3456]86)$" OR CMAKE_GENERATOR_PLATFORM MATCHES "^(x86|Win32)$")
set(MI_ARCH "x86")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "x64")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "x64") # must be before arm64
set(MI_ARCH "x64")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8.?)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8.?|ARM64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64")
set(MI_ARCH "arm64")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|armv[34567])$")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|armv[34567]|ARM)$")
set(MI_ARCH "arm32")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
if(CMAKE_SIZEOF_VOID_P==4)
@@ -342,7 +347,7 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
else()
set(MI_ARCH ${CMAKE_SYSTEM_PROCESSOR})
endif()
-message(STATUS "Architecture: ${MI_ARCH}")
+message(STATUS "Architecture: ${MI_ARCH}") # (${CMAKE_SYSTEM_PROCESSOR}, ${CMAKE_GENERATOR_PLATFORM}, ${CMAKE_GENERATOR})")
# Check /proc/cpuinfo for an SV39 MMU and limit the virtual address bits.
# (this will skip the aligned hinting in that case. Issue #939, #949)
@@ -547,8 +552,14 @@ if(MI_BUILD_SHARED)
)
if(WIN32 AND MI_WIN_REDIRECT)
# On windows, link and copy the mimalloc redirection dll too.
- if(MI_ARCH STREQUAL "x64")
+ if(CMAKE_GENERATOR_PLATFORM STREQUAL "arm64ec")
+ set(MIMALLOC_REDIRECT_SUFFIX "-arm64ec")
+ elseif(MI_ARCH STREQUAL "x64")
set(MIMALLOC_REDIRECT_SUFFIX "")
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
+ message(STATUS "Note: x64 code emulated on Windows for arm64 should use an arm64ec build of 'mimalloc-override.dll'")
+ message(STATUS " with 'mimalloc-redirect-arm64ec.dll'. See the 'bin\\readme.md' for more information.")
+ endif()
elseif(MI_ARCH STREQUAL "x86")
set(MIMALLOC_REDIRECT_SUFFIX "32")
else()
@@ -670,12 +681,7 @@ endif()
# -----------------------------------------------------------------------------
if (MI_OVERRIDE)
if (MI_BUILD_SHARED)
- target_compile_definitions(mimalloc PRIVATE MI_MALLOC_OVERRIDE)
- if (WIN32)
- # on windows we should generate mimalloc-override.dll.
- # string(REPLACE "mimalloc" "mimalloc-override" mi_override_output_name ${mi_basename})
- # set_target_properties(mimalloc PROPERTIES OUTPUT_NAME ${mi_override_output_name})
- endif()
+ target_compile_definitions(mimalloc PRIVATE MI_MALLOC_OVERRIDE)
endif()
if(NOT WIN32)
# It is only possible to override malloc on Windows when building as a DLL.
diff --git a/bin/mimalloc-redirect-arm64.dll b/bin/mimalloc-redirect-arm64.dll
index 2b1d3e35..455f8394 100644
Binary files a/bin/mimalloc-redirect-arm64.dll and b/bin/mimalloc-redirect-arm64.dll differ
diff --git a/bin/mimalloc-redirect-arm64ec.dll b/bin/mimalloc-redirect-arm64ec.dll
new file mode 100644
index 00000000..62569b57
Binary files /dev/null and b/bin/mimalloc-redirect-arm64ec.dll differ
diff --git a/bin/mimalloc-redirect-arm64ec.lib b/bin/mimalloc-redirect-arm64ec.lib
new file mode 100644
index 00000000..eb724d74
Binary files /dev/null and b/bin/mimalloc-redirect-arm64ec.lib differ
diff --git a/bin/mimalloc-redirect.dll b/bin/mimalloc-redirect.dll
index 4702fec0..7d0ec33b 100644
Binary files a/bin/mimalloc-redirect.dll and b/bin/mimalloc-redirect.dll differ
diff --git a/bin/mimalloc-redirect.lib b/bin/mimalloc-redirect.lib
index 7d5f19ce..851455a5 100644
Binary files a/bin/mimalloc-redirect.lib and b/bin/mimalloc-redirect.lib differ
diff --git a/bin/mimalloc-redirect32.dll b/bin/mimalloc-redirect32.dll
index 17c05550..cc661036 100644
Binary files a/bin/mimalloc-redirect32.dll and b/bin/mimalloc-redirect32.dll differ
diff --git a/bin/mimalloc-redirect32.lib b/bin/mimalloc-redirect32.lib
index a7100afc..45d7297d 100644
Binary files a/bin/mimalloc-redirect32.lib and b/bin/mimalloc-redirect32.lib differ
diff --git a/bin/minject-arm64.exe b/bin/minject-arm64.exe
index 97188c4f..637c95d9 100644
Binary files a/bin/minject-arm64.exe and b/bin/minject-arm64.exe differ
diff --git a/bin/minject.exe b/bin/minject.exe
index 53c42f5d..bb445706 100644
Binary files a/bin/minject.exe and b/bin/minject.exe differ
diff --git a/bin/minject32.exe b/bin/minject32.exe
index 926facfd..6dcb8da9 100644
Binary files a/bin/minject32.exe and b/bin/minject32.exe differ
diff --git a/bin/readme.md b/bin/readme.md
index d133eea2..bc115ce1 100644
--- a/bin/readme.md
+++ b/bin/readme.md
@@ -1,28 +1,30 @@
# Windows Override
Dynamically overriding on mimalloc on Windows
-is robust and has the particular advantage to be able to redirect all malloc/free calls that go through
-the (dynamic) C runtime allocator, including those from other DLL's or libraries.
-As it intercepts all allocation calls on a low level, it can be used reliably
+is robust and has the particular advantage to be able to redirect all malloc/free calls
+that go through the (dynamic) C runtime allocator, including those from other DLL's or
+libraries. As it intercepts all allocation calls on a low level, it can be used reliably
on large programs that include other 3rd party components.
-There are four requirements to make the overriding work robustly:
+There are four requirements to make the overriding work well:
1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
-2. Link your program explicitly with `mimalloc-override.dll` library.
- To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some
- call to the mimalloc API in the `main` function, like `mi_version()`
- (or use the `/INCLUDE:mi_version` switch on the linker, or
- use `#pragma comment(linker, "/include:mi_version")` in some source file).
- See the `mimalloc-override-test` project for an example on how to use this.
+2. Link your program explicitly with the `mimalloc.lib` export library for
+ the `mimalloc.dll` -- which contains all mimalloc functionality.
+ To ensure the `mimalloc.dll` is actually loaded at run-time it is easiest
+ to insert some call to the mimalloc API in the `main` function, like `mi_version()`
+ (or use the `/include:mi_version` switch on the linker, or
+ similarly, `#pragma comment(linker, "/include:mi_version")` in some source file).
+ See the `mimalloc-test-override` project for an example on how to use this.
-3. The `mimalloc-redirect.dll` (x64) (or `mimalloc-redirect32.dll` (x86), or `mimalloc-redirect-arm64.dll` (arm64)) must be put
- in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
- The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
- mimalloc functions (which reside in `mimalloc-override.dll`).
+3. The `mimalloc-redirect.dll` must be put in the same folder as the main
+ `mimalloc.dll` at runtime (as it is a dependency of that DLL).
+ The redirection DLL ensures that all calls to the C runtime malloc API get
+ redirected to mimalloc functions (which reside in `mimalloc.dll`).
-4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
+4. Ensure the `mimalloc.dll` comes as early as possible in the import
list of the final executable (so it can intercept all potential allocations).
+ You can use `minject -l ` to check this if needed.
For best performance on Windows with C++, it
is also recommended to also override the `new`/`delete` operations (by including
@@ -30,19 +32,42 @@ is also recommended to also override the `new`/`delete` operations (by including
a single(!) source file in your project).
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
-overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected.
+overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully
+redirected.
-## Minject
+### Other Platforms
-We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always
-ensure the the DLL comes first in the import table of the final executable.
+You always link with `mimalloc.dll` but for different platforms you may
+need a specific redirection DLL:
+
+- __x64__: `mimalloc-redirect.dll`.
+- __x86__: `mimalloc-redirect32.dll`. Use for older 32-bit Windows programs.
+- __arm64__: `mimalloc-redirect-arm64.dll`. Use for native Windows arm64 programs.
+- __arm64ec__: `mimalloc-redirect-arm64ec.dll`. The [arm64ec] ABI is "emulation compatible"
+ mode on Windows arm64. Unfortunately we cannot run x64 code emulated on Windows arm64 with
+ the x64 mimalloc override directly (since the C runtime always uses `arm64ec`). Instead:
+ 1. Build the program as normal for x64 and link as normal with the x64
+ `mimalloc.lib` export library.
+ 2. Now separately build `mimalloc.dll` in `arm64ec` mode and _overwrite_ your
+ previous (x64) `mimalloc.dll` -- the loader can handle the mix of arm64ec
+ and x64 code. Now use `mimalloc-redirect-arm64ec.dll` to match your new
+ arm64ec `mimalloc.dll`. The main program stays as is and can be fully x64
+ or contain more arm64ec modules. At runtime, the arm64ec `mimalloc.dll` will
+ run with native arm64 instructions while the rest of the program runs emulated x64.
+
+[arm64ec]: https://learn.microsoft.com/en-us/windows/arm/arm64ec
+
+
+### Minject
+
+We cannot always re-link an executable with `mimalloc.dll`, and similarly, we
+cannot always ensure that the DLL comes first in the import table of the final executable.
In many cases though we can patch existing executables without any recompilation
-if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll`
-into the import table (and put `mimalloc-redirect.dll` in the same folder)
-Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388).
+if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the
+`mimalloc.dll` into the import table (and put `mimalloc-redirect.dll` in the same
+directory) Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388).
The `minject` program can also do this from the command line
-(or `minject32` for 32-bit PE files, or `minject-arm64` on arm64 Windows).
Use `minject --help` for options:
```
@@ -61,8 +86,8 @@ options:
-l --list only list imported modules
-i --inplace update the exe in-place (make sure there is a backup!)
-f --force always overwrite without prompting
- --postfix=
use
as a postfix to the mimalloc dll (default is 'override')
- e.g. use --postfix=override-debug to link with mimalloc-override-debug.dll
+ --postfix=
use
as a postfix to the mimalloc dll.
+ e.g. use --postfix=debug to link with mimalloc-debug.dll
notes:
Without '--inplace' an injected is generated with the same name ending in '-mi'.
@@ -72,3 +97,6 @@ examples:
> minject --list myprogram.exe
> minject --force --inplace myprogram.exe
```
+
+For x86 32-bit binaries, use `minject32`, and for arm64 binaries use `minject-arm64`.
+
diff --git a/ide/vs2022/mimalloc-override-test.vcxproj b/ide/vs2022/mimalloc-override-test.vcxproj
index ff5d53d0..0e87cf36 100644
--- a/ide/vs2022/mimalloc-override-test.vcxproj
+++ b/ide/vs2022/mimalloc-override-test.vcxproj
@@ -5,6 +5,10 @@
DebugARM64
+
+ Debug
+ ARM64EC
+ DebugWin32
@@ -13,6 +17,10 @@
ReleaseARM64
+
+ Release
+ ARM64EC
+ ReleaseWin32
@@ -31,7 +39,7 @@
{FEF7868F-750E-4C21-A04D-22707CC66879}mimalloc-override-test10.0
- mimalloc-override-test
+ mimalloc-test-override
@@ -55,6 +63,11 @@
truev143
+
+ Application
+ true
+ v143
+ Applicationfalse
@@ -67,6 +80,12 @@
v143true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ Level3
@@ -185,6 +218,30 @@
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+ MultiThreadedDebugDLL
+ Sync
+ Default
+ false
+
+
+ Console
+
+
+ kernel32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
@@ -258,6 +315,31 @@
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ _MBCS;%(PreprocessorDefinitions);NDEBUG
+ MultiThreadedDLL
+
+
+ true
+ true
+ Console
+
+
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
diff --git a/ide/vs2022/mimalloc-override.vcxproj b/ide/vs2022/mimalloc-override.vcxproj
index 426c7be4..609fd3ba 100644
--- a/ide/vs2022/mimalloc-override.vcxproj
+++ b/ide/vs2022/mimalloc-override.vcxproj
@@ -5,6 +5,10 @@
DebugARM64
+
+ Debug
+ ARM64EC
+ DebugWin32
@@ -13,6 +17,10 @@
ReleaseARM64
+
+ Release
+ ARM64EC
+ ReleaseWin32
@@ -31,7 +39,7 @@
{ABB5EAE7-B3E6-432E-B636-333449892EA7}mimalloc-override10.0
- mimalloc-override
+ mimalloc-override-dll
@@ -54,6 +62,11 @@
truev143
+
+ DynamicLibrary
+ true
+ v143
+ DynamicLibraryfalse
@@ -64,6 +77,11 @@
falsev143
+
+ DynamicLibrary
+ false
+ v143
+
@@ -81,48 +99,66 @@
+
+
+
+
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\.dll
- mimalloc-override
+ mimalloc$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\.dll
- mimalloc-override
+ mimalloc$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\.dll
- mimalloc-override
+ mimalloc$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\.dll
- mimalloc-override
+ mimalloc
+
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .dll
+ mimalloc$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\.dll
- mimalloc-override
+ mimalloc$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\.dll
- mimalloc-override
+ mimalloc
+
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .dll
+ mimalloc
@@ -208,6 +244,34 @@
copy mimalloc-redirect-arm64.dll to the output directory
+
+
+ Level3
+ Disabled
+ true
+ true
+ ../../include
+ MI_DEBUG=4;MI_SHARED_LIB;MI_SHARED_LIB_EXPORT;MI_MALLOC_OVERRIDE;%(PreprocessorDefinitions);
+ MultiThreadedDebugDLL
+ false
+ CompileAsCpp
+
+
+ $(ProjectDir)\..\..\bin\mimalloc-redirect-arm64ec.lib;%(AdditionalDependencies)
+
+
+
+
+ Default
+ false
+
+
+ COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64ec.dll" "$(OutputPath)"
+
+
+ copy mimalloc-redirect-arm64ec.dll to the output directory
+
+ Level3
@@ -305,6 +369,39 @@
copy mimalloc-redirect-arm64.dll to the output directory
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ ../../include
+ MI_SHARED_LIB;MI_SHARED_LIB_EXPORT;MI_MALLOC_OVERRIDE;%(PreprocessorDefinitions);NDEBUG
+ AssemblyAndSourceCode
+ $(IntDir)
+ false
+ MultiThreadedDLL
+ CompileAsCpp
+ false
+ CPUExtensionRequirementsARMv81
+
+
+ true
+ true
+ $(ProjectDir)\..\..\bin\mimalloc-redirect-arm64ec.lib;%(AdditionalDependencies)
+
+
+ Default
+ false
+
+
+ COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64ec.dll" "$(OutputPath)"
+
+
+ copy mimalloc-redirect-arm64ec.dll to the output directory
+
+
@@ -324,16 +421,20 @@
falsefalsefalse
+ falsefalsefalse
+ falsetruetruetruetrue
+ truetruetrue
+ true
@@ -345,8 +446,10 @@
truetruetrue
+ truetruetrue
+ true
@@ -358,8 +461,10 @@
truetruetrue
+ truetruetrue
+ true
@@ -368,8 +473,10 @@
truetruetrue
+ truetruetrue
+ true
diff --git a/ide/vs2022/mimalloc-test-api.vcxproj b/ide/vs2022/mimalloc-test-api.vcxproj
index babe7f96..27247569 100644
--- a/ide/vs2022/mimalloc-test-api.vcxproj
+++ b/ide/vs2022/mimalloc-test-api.vcxproj
@@ -5,6 +5,10 @@
DebugARM64
+
+ Debug
+ ARM64EC
+ DebugWin32
@@ -13,6 +17,10 @@
ReleaseARM64
+
+ Release
+ ARM64EC
+ ReleaseWin32
@@ -55,6 +63,11 @@
truev143
+
+ Application
+ true
+ v143
+ Applicationfalse
@@ -67,6 +80,12 @@
v143true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ Level3
@@ -151,6 +184,18 @@
Console
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+
+
+ Console
+
+ Level3
@@ -202,18 +247,38 @@
Console
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ %(PreprocessorDefinitions);NDEBUG
+
+
+ true
+ true
+ Console
+
+ truetruetruetrue
+ truetruetrue
+ truefalsefalse
+ false
diff --git a/ide/vs2022/mimalloc-test-stress.vcxproj b/ide/vs2022/mimalloc-test-stress.vcxproj
index c033aaeb..fd88cd8e 100644
--- a/ide/vs2022/mimalloc-test-stress.vcxproj
+++ b/ide/vs2022/mimalloc-test-stress.vcxproj
@@ -5,6 +5,10 @@
DebugARM64
+
+ Debug
+ ARM64EC
+ DebugWin32
@@ -13,6 +17,10 @@
ReleaseARM64
+
+ Release
+ ARM64EC
+ ReleaseWin32
@@ -55,6 +63,11 @@
truev143
+
+ Application
+ true
+ v143
+ Applicationfalse
@@ -67,6 +80,12 @@
v143true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ Level3
@@ -151,6 +184,18 @@
Console
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+
+
+ Console
+
+ Level3
@@ -203,14 +248,34 @@
Console
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ %(PreprocessorDefinitions);NDEBUG
+ CPUExtensionRequirementsARMv81
+
+
+ true
+ true
+ Console
+
+ falsefalsefalse
+ falsefalsefalsefalse
+ false
diff --git a/ide/vs2022/mimalloc-test.vcxproj b/ide/vs2022/mimalloc-test.vcxproj
index bfd72287..a8b36d5e 100644
--- a/ide/vs2022/mimalloc-test.vcxproj
+++ b/ide/vs2022/mimalloc-test.vcxproj
@@ -5,6 +5,10 @@
DebugARM64
+
+ Debug
+ ARM64EC
+ DebugWin32
@@ -13,6 +17,10 @@
ReleaseARM64
+
+ Release
+ ARM64EC
+ ReleaseWin32
@@ -31,7 +39,7 @@
{FEF7858F-750E-4C21-A04D-22707CC66878}mimalloctest10.0
- mimalloc-test
+ mimalloc-test-static
@@ -55,6 +63,11 @@
truev143
+
+ Application
+ true
+ v143
+ Applicationfalse
@@ -67,6 +80,12 @@
v143true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ Level3
@@ -154,6 +187,19 @@
Console
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+ stdcpp17
+
+
+ Console
+
+ Level3
@@ -208,6 +254,24 @@
Console
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ _MBCS;%(PreprocessorDefinitions);NDEBUG
+ stdcpp17
+
+
+ true
+ true
+ Console
+
+ {abb5eae7-b3e6-432e-b636-333449892ea6}
diff --git a/ide/vs2022/mimalloc.sln b/ide/vs2022/mimalloc.sln
index e4a6538b..5a55c98b 100644
--- a/ide/vs2022/mimalloc.sln
+++ b/ide/vs2022/mimalloc.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
-VisualStudioVersion = 17.12.35527.113 d17.12
+VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mimalloc", "mimalloc.vcxproj", "{ABB5EAE7-B3E6-432E-B636-333449892EA6}"
EndProject
@@ -18,81 +18,107 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
+ Debug|ARM64EC = Debug|ARM64EC
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM64 = Release|ARM64
+ Release|ARM64EC = Release|ARM64EC
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64.ActiveCfg = Debug|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64.Build.0 = Debug|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x64.ActiveCfg = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x64.Build.0 = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x86.ActiveCfg = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x86.Build.0 = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64.ActiveCfg = Release|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64.Build.0 = Release|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64EC.Build.0 = Release|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x64.ActiveCfg = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x64.Build.0 = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x86.ActiveCfg = Release|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x86.Build.0 = Release|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x64.ActiveCfg = Debug|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x64.Build.0 = Debug|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x86.ActiveCfg = Debug|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x86.Build.0 = Debug|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64.ActiveCfg = Release|ARM64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64.Build.0 = Release|ARM64
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x64.ActiveCfg = Release|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x64.Build.0 = Release|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x86.ActiveCfg = Release|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x86.Build.0 = Release|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64.ActiveCfg = Debug|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64.Build.0 = Debug|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x64.ActiveCfg = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x64.Build.0 = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x86.ActiveCfg = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x86.Build.0 = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64.ActiveCfg = Release|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64.Build.0 = Release|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64EC.Build.0 = Release|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x64.ActiveCfg = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x64.Build.0 = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x86.ActiveCfg = Release|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x86.Build.0 = Release|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x64.ActiveCfg = Debug|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x64.Build.0 = Debug|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x86.ActiveCfg = Debug|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x86.Build.0 = Debug|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64.ActiveCfg = Release|ARM64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64.Build.0 = Release|ARM64
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x64.ActiveCfg = Release|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x64.Build.0 = Release|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x86.ActiveCfg = Release|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x86.Build.0 = Release|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.ActiveCfg = Debug|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.Build.0 = Debug|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.ActiveCfg = Debug|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.Build.0 = Debug|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.ActiveCfg = Release|ARM64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.Build.0 = Release|ARM64
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.ActiveCfg = Release|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.Build.0 = Release|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x86.ActiveCfg = Release|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x86.Build.0 = Release|Win32
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.ActiveCfg = Debug|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.Build.0 = Debug|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.ActiveCfg = Debug|Win32
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.Build.0 = Debug|Win32
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.ActiveCfg = Release|ARM64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.Build.0 = Release|ARM64
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.ActiveCfg = Release|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.Build.0 = Release|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|x86.ActiveCfg = Release|Win32
diff --git a/ide/vs2022/mimalloc.vcxproj b/ide/vs2022/mimalloc.vcxproj
index 2ac86259..87e866bb 100644
--- a/ide/vs2022/mimalloc.vcxproj
+++ b/ide/vs2022/mimalloc.vcxproj
@@ -5,6 +5,10 @@
DebugARM64
+
+ Debug
+ ARM64EC
+ DebugWin32
@@ -13,6 +17,10 @@
ReleaseARM64
+
+ Release
+ ARM64EC
+ ReleaseWin32
@@ -31,7 +39,7 @@
{ABB5EAE7-B3E6-432E-B636-333449892EA6}mimalloc10.0
- mimalloc
+ mimalloc-lib
@@ -55,6 +63,11 @@
truev143
+
+ StaticLibrary
+ true
+ v143
+ StaticLibraryfalse
@@ -67,6 +80,12 @@
v143true
+
+ StaticLibrary
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -115,6 +140,12 @@
.libmimalloc-static
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .lib
+ mimalloc-static
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -127,6 +158,12 @@
.libmimalloc-static
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .lib
+ mimalloc-static
+ Level4
@@ -200,6 +237,33 @@
+
+
+ Level4
+ Disabled
+ true
+ Default
+ ../../include
+ MI_DEBUG=3;MI_GUARDED=0;%(PreprocessorDefinitions);
+ CompileAsCpp
+ false
+ stdcpp20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
@@ -299,22 +363,62 @@
+
+
+ Level4
+ MaxSpeed
+ true
+ Default
+ ../../include
+ %(PreprocessorDefinitions);NDEBUG
+ AssemblyAndSourceCode
+ $(IntDir)
+ false
+ false
+ Default
+ CompileAsCpp
+ true
+ stdcpp20
+ CPUExtensionRequirementsARMv81
+ Sync
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ falsefalsefalse
+ falsefalsefalsefalse
+ falsetruetruetruetrue
+ truetruetrue
+ true
@@ -323,14 +427,17 @@
falsefalse
+ falsetruetrue
+ truetruetruetruetrue
+ true
@@ -342,8 +449,10 @@
truetruetrue
+ truetruetrue
+ true
@@ -351,8 +460,10 @@
truetruetrue
+ truetruetrue
+ true
diff --git a/readme.md b/readme.md
index a0296b43..11f62da4 100644
--- a/readme.md
+++ b/readme.md
@@ -164,7 +164,7 @@ The `mimalloc` project builds a static library (in `out/msvc-x64`), while the
`mimalloc-override` project builds a DLL for overriding malloc
in the entire program.
-## macOS, Linux, BSD, etc.
+## Linux, macOS, BSD, etc.
We use [`cmake`](https://cmake.org)1 as the build system:
@@ -200,13 +200,26 @@ free lists, etc., as:
> make
```
This will name the shared library as `libmimalloc-secure.so`.
-Use `ccmake`2 instead of `cmake`
-to see and customize all the available build options.
+Use `cmake ../.. -LH` to see all the available build options.
-Notes:
-1. Install CMake: `sudo apt-get install cmake`
-2. Install CCMake: `sudo apt-get install cmake-curses-gui`
+The examples use the default compiler. If you like to use another, use:
+```
+> CC=clang CXX=clang++ cmake ../..
+```
+## Cmake with Visual Studio
+
+You can also use cmake on Windows. Open a Visual Studio development prompt
+and invoke `cmake` with the right [generator](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2017%202022.html)
+and architecture, like:
+```
+> cmake ..\.. -G "Visual Studio 17 2022" -A x64 -DMI_OVERRIDE=ON
+```
+
+The cmake build type is specified when actually building, for example:
+```
+> cmake --build . --config=Release
+```
## Single source
@@ -415,43 +428,48 @@ Note that certain security restrictions may apply when doing this from
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
-### Dynamic Override on Windows
+# Windows Override
Dynamically overriding on mimalloc on Windows
-is robust and has the particular advantage to be able to redirect all malloc/free calls that go through
-the (dynamic) C runtime allocator, including those from other DLL's or libraries.
-As it intercepts all allocation calls on a low level, it can be used reliably
+is robust and has the particular advantage to be able to redirect all malloc/free calls
+that go through the (dynamic) C runtime allocator, including those from other DLL's or
+libraries. As it intercepts all allocation calls on a low level, it can be used reliably
on large programs that include other 3rd party components.
-There are four requirements to make the overriding work robustly:
+There are four requirements to make the overriding work well:
1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
-2. Link your program explicitly with `mimalloc-override.dll` library.
- To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some
- call to the mimalloc API in the `main` function, like `mi_version()`
- (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project
- for an example on how to use this.
-3. The [`mimalloc-redirect.dll`](bin) (or `mimalloc-redirect32.dll`) must be put
- in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
- The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
- mimalloc functions (which reside in `mimalloc-override.dll`).
-4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
+
+2. Link your program explicitly with the `mimalloc.lib` export library for the `mimalloc.dll`.
+ (which must be compiled with `-DMI_OVERRIDE=ON`, which is the default though).
+ To ensure the `mimalloc.dll` is actually loaded at run-time it is easiest
+ to insert some call to the mimalloc API in the `main` function, like `mi_version()`
+ (or use the `/include:mi_version` switch on the linker command, or
+ similarly, `#pragma comment(linker, "/include:mi_version")` in some source file).
+ See the `mimalloc-test-override` project for an example on how to use this.
+
+3. The `mimalloc-redirect.dll` must be put in the same folder as the main
+ `mimalloc.dll` at runtime (as it is a dependency of that DLL).
+ The redirection DLL ensures that all calls to the C runtime malloc API get
+ redirected to mimalloc functions (which reside in `mimalloc.dll`).
+
+4. Ensure the `mimalloc.dll` comes as early as possible in the import
list of the final executable (so it can intercept all potential allocations).
+ You can use `minject -l ` to check this if needed.
For best performance on Windows with C++, it
is also recommended to also override the `new`/`delete` operations (by including
-[`mimalloc-new-delete.h`](include/mimalloc-new-delete.h)
+[`mimalloc-new-delete.h`](../include/mimalloc-new-delete.h)
a single(!) source file in your project).
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
-overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected.
+overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully
+redirected.
+
+For different platforms than x64, you may need a specific [redirection dll](bin).
+Furthermore, we cannot always re-link an executable or ensure `mimalloc.dll` comes
+first in the import table. In such cases the [`minject`](bin) tool can be used
+to patch the executable's import tables.
-We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always
-ensure the the DLL comes first in the import table of the final executable.
-In many cases though we can patch existing executables without any recompilation
-if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll`
-into the import table (and put `mimalloc-redirect.dll` in the same folder)
-Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388) or
-the [`minject`](bin) program.
## Static override
diff --git a/test/main-override.cpp b/test/main-override.cpp
index af7f5b6f..bc1a1125 100644
--- a/test/main-override.cpp
+++ b/test/main-override.cpp
@@ -47,6 +47,7 @@ int main() {
mi_stats_reset(); // ignore earlier allocations
various_tests();
test_mixed1();
+
//test_std_string();
//test_thread_local();
// heap_thread_free_huge();
@@ -107,6 +108,9 @@ static void various_tests() {
t = new (tbuf) Test(42);
t->~Test();
delete[] tbuf;
+
+ const char* ptr = ::_Getdays(); // test _base overrid
+ free((void*)ptr);
}
class Static {