mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 15:29:31 +03:00
Merge branch 'dev' into dev-slice
This commit is contained in:
commit
41ccb766f6
10 changed files with 96 additions and 72 deletions
|
@ -88,6 +88,11 @@ if (NOT CMAKE_BUILD_TYPE)
|
||||||
endif()
|
endif()
|
||||||
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$")
|
if("${CMAKE_BINARY_DIR}" MATCHES ".*(S|s)ecure$")
|
||||||
message(STATUS "Default to secure build")
|
message(STATUS "Default to secure build")
|
||||||
set(MI_SECURE "ON")
|
set(MI_SECURE "ON")
|
||||||
|
@ -326,11 +331,11 @@ set(MI_OPT_ARCH_FLAGS "")
|
||||||
set(MI_ARCH "unknown")
|
set(MI_ARCH "unknown")
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3456]86)$" OR CMAKE_GENERATOR_PLATFORM MATCHES "^(x86|Win32)$")
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3456]86)$" OR CMAKE_GENERATOR_PLATFORM MATCHES "^(x86|Win32)$")
|
||||||
set(MI_ARCH "x86")
|
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")
|
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")
|
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")
|
set(MI_ARCH "arm32")
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
|
||||||
if(CMAKE_SIZEOF_VOID_P==4)
|
if(CMAKE_SIZEOF_VOID_P==4)
|
||||||
|
@ -341,7 +346,7 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
|
||||||
else()
|
else()
|
||||||
set(MI_ARCH ${CMAKE_SYSTEM_PROCESSOR})
|
set(MI_ARCH ${CMAKE_SYSTEM_PROCESSOR})
|
||||||
endif()
|
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.
|
# 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)
|
# (this will skip the aligned hinting in that case. Issue #939, #949)
|
||||||
|
@ -533,8 +538,14 @@ if(MI_BUILD_SHARED)
|
||||||
)
|
)
|
||||||
if(WIN32 AND MI_WIN_REDIRECT)
|
if(WIN32 AND MI_WIN_REDIRECT)
|
||||||
# On windows, link and copy the mimalloc redirection dll too.
|
# 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 "")
|
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")
|
elseif(MI_ARCH STREQUAL "x86")
|
||||||
set(MIMALLOC_REDIRECT_SUFFIX "32")
|
set(MIMALLOC_REDIRECT_SUFFIX "32")
|
||||||
else()
|
else()
|
||||||
|
@ -657,11 +668,6 @@ endif()
|
||||||
if (MI_OVERRIDE)
|
if (MI_OVERRIDE)
|
||||||
if (MI_BUILD_SHARED)
|
if (MI_BUILD_SHARED)
|
||||||
target_compile_definitions(mimalloc PRIVATE MI_MALLOC_OVERRIDE)
|
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()
|
|
||||||
endif()
|
endif()
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
# It is only possible to override malloc on Windows when building as a DLL.
|
# It is only possible to override malloc on Windows when building as a DLL.
|
||||||
|
|
Binary file not shown.
BIN
bin/minject.exe
BIN
bin/minject.exe
Binary file not shown.
Binary file not shown.
|
@ -9,20 +9,20 @@ 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).
|
1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
|
||||||
|
|
||||||
2. Link your program explicitly with the `mimalloc-override.lib` export library for
|
2. Link your program explicitly with the `mimalloc.lib` export library for
|
||||||
the `mimalloc-override.dll` -- which contains all mimalloc functionality.
|
the `mimalloc.dll` -- which contains all mimalloc functionality.
|
||||||
To ensure the `mimalloc-override.dll` is actually loaded at run-time it is easiest
|
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()`
|
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
|
(or use the `/include:mi_version` switch on the linker, or
|
||||||
use `#pragma comment(linker, "/include:mi_version")` in some source file).
|
similarly, `#pragma comment(linker, "/include:mi_version")` in some source file).
|
||||||
See the `mimalloc-override-test` project for an example on how to use this.
|
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
|
3. The `mimalloc-redirect.dll` must be put in the same folder as the main
|
||||||
`mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
|
`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
|
The redirection DLL ensures that all calls to the C runtime malloc API get
|
||||||
redirected to mimalloc functions (which reside in `mimalloc-override.dll`).
|
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).
|
list of the final executable (so it can intercept all potential allocations).
|
||||||
You can use `minject -l <exe>` to check this if needed.
|
You can use `minject -l <exe>` to check this if needed.
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@ redirected.
|
||||||
|
|
||||||
### Other Platforms
|
### Other Platforms
|
||||||
|
|
||||||
You always link with `mimalloc-override.dll` but for different platforms you may
|
You always link with `mimalloc.dll` but for different platforms you may
|
||||||
need a specific `mimalloc-redirect.dll`:
|
need a specific redirection DLL:
|
||||||
|
|
||||||
- __x64__: `mimalloc-redirect.dll`.
|
- __x64__: `mimalloc-redirect.dll`.
|
||||||
- __x86__: `mimalloc-redirect32.dll`. Use for older 32-bit Windows programs.
|
- __x86__: `mimalloc-redirect32.dll`. Use for older 32-bit Windows programs.
|
||||||
|
@ -47,12 +47,12 @@ need a specific `mimalloc-redirect.dll`:
|
||||||
mode on Windows arm64. Unfortunately we cannot run x64 code emulated on Windows arm64 with
|
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:
|
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
|
1. Build the program as normal for x64 and link as normal with the x64
|
||||||
`mimalloc-override.lib` export library.
|
`mimalloc.lib` export library.
|
||||||
2. Now separately build `mimalloc-override.dll` in `arm64ec` mode and _overwrite_ your
|
2. Now separately build `mimalloc.dll` in `arm64ec` mode and _overwrite_ your
|
||||||
previous (x64) `mimalloc-override.dll` -- the loader can handle the mix of arm64ec
|
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
|
and x64 code. Now use `mimalloc-redirect-arm64ec.dll` to match your new
|
||||||
arm64ec `mimalloc-override.dll`. The main program stays as is and can be fully x64
|
arm64ec `mimalloc.dll`. The main program stays as is and can be fully x64
|
||||||
or contain more arm64ec modules. At runtime, the arm64ec `mimalloc-override.dll` will
|
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.
|
run with native arm64 instructions while the rest of the program runs emulated x64.
|
||||||
|
|
||||||
[arm64ec]: https://learn.microsoft.com/en-us/windows/arm/arm64ec
|
[arm64ec]: https://learn.microsoft.com/en-us/windows/arm/arm64ec
|
||||||
|
@ -60,11 +60,11 @@ need a specific `mimalloc-redirect.dll`:
|
||||||
|
|
||||||
### Minject
|
### Minject
|
||||||
|
|
||||||
We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we
|
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.
|
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
|
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
|
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
|
`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).
|
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
|
The `minject` program can also do this from the command line
|
||||||
|
@ -86,8 +86,8 @@ options:
|
||||||
-l --list only list imported modules
|
-l --list only list imported modules
|
||||||
-i --inplace update the exe in-place (make sure there is a backup!)
|
-i --inplace update the exe in-place (make sure there is a backup!)
|
||||||
-f --force always overwrite without prompting
|
-f --force always overwrite without prompting
|
||||||
--postfix=<p> use <p> as a postfix to the mimalloc dll (default is 'override')
|
--postfix=<p> use <p> as a postfix to the mimalloc dll.
|
||||||
e.g. use --postfix=override-debug to link with mimalloc-override-debug.dll
|
e.g. use --postfix=debug to link with mimalloc-debug.dll
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
Without '--inplace' an injected <exe> is generated with the same name ending in '-mi'.
|
Without '--inplace' an injected <exe> is generated with the same name ending in '-mi'.
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<ProjectGuid>{FEF7868F-750E-4C21-A04D-22707CC66879}</ProjectGuid>
|
<ProjectGuid>{FEF7868F-750E-4C21-A04D-22707CC66879}</ProjectGuid>
|
||||||
<RootNamespace>mimalloc-override-test</RootNamespace>
|
<RootNamespace>mimalloc-override-test</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
<ProjectName>mimalloc-override-test</ProjectName>
|
<ProjectName>mimalloc-test-override</ProjectName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<ProjectGuid>{ABB5EAE7-B3E6-432E-B636-333449892EA7}</ProjectGuid>
|
<ProjectGuid>{ABB5EAE7-B3E6-432E-B636-333449892EA7}</ProjectGuid>
|
||||||
<RootNamespace>mimalloc-override</RootNamespace>
|
<RootNamespace>mimalloc-override</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
<ProjectName>mimalloc-override</ProjectName>
|
<ProjectName>mimalloc-override-dll</ProjectName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
@ -116,49 +116,49 @@
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64EC'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64EC'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64EC'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64EC'">
|
||||||
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
<IntDir>$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>mimalloc-override</TargetName>
|
<TargetName>mimalloc</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<ProjectGuid>{FEF7858F-750E-4C21-A04D-22707CC66878}</ProjectGuid>
|
<ProjectGuid>{FEF7858F-750E-4C21-A04D-22707CC66878}</ProjectGuid>
|
||||||
<RootNamespace>mimalloctest</RootNamespace>
|
<RootNamespace>mimalloctest</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
<ProjectName>mimalloc-test</ProjectName>
|
<ProjectName>mimalloc-test-static</ProjectName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<ProjectGuid>{ABB5EAE7-B3E6-432E-B636-333449892EA6}</ProjectGuid>
|
<ProjectGuid>{ABB5EAE7-B3E6-432E-B636-333449892EA6}</ProjectGuid>
|
||||||
<RootNamespace>mimalloc</RootNamespace>
|
<RootNamespace>mimalloc</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
<ProjectName>mimalloc</ProjectName>
|
<ProjectName>mimalloc-lib</ProjectName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
|
78
readme.md
78
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
|
`mimalloc-override` project builds a DLL for overriding malloc
|
||||||
in the entire program.
|
in the entire program.
|
||||||
|
|
||||||
## macOS, Linux, BSD, etc.
|
## Linux, macOS, BSD, etc.
|
||||||
|
|
||||||
We use [`cmake`](https://cmake.org)<sup>1</sup> as the build system:
|
We use [`cmake`](https://cmake.org)<sup>1</sup> as the build system:
|
||||||
|
|
||||||
|
@ -200,13 +200,26 @@ free lists, etc., as:
|
||||||
> make
|
> make
|
||||||
```
|
```
|
||||||
This will name the shared library as `libmimalloc-secure.so`.
|
This will name the shared library as `libmimalloc-secure.so`.
|
||||||
Use `ccmake`<sup>2</sup> instead of `cmake`
|
Use `cmake ../.. -LH` to see all the available build options.
|
||||||
to see and customize all the available build options.
|
|
||||||
|
|
||||||
Notes:
|
The examples use the default compiler. If you like to use another, use:
|
||||||
1. Install CMake: `sudo apt-get install cmake`
|
```
|
||||||
2. Install CCMake: `sudo apt-get install cmake-curses-gui`
|
> 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
|
## 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).
|
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
|
||||||
|
|
||||||
|
|
||||||
### Dynamic Override on Windows
|
# Windows Override
|
||||||
|
|
||||||
<span id="override_on_windows">Dynamically overriding on mimalloc on Windows</span>
|
<span id="override_on_windows">Dynamically overriding on mimalloc on Windows</span>
|
||||||
is robust and has the particular advantage to be able to redirect all malloc/free calls that go through
|
is robust and has the particular advantage to be able to redirect all malloc/free calls
|
||||||
the (dynamic) C runtime allocator, including those from other DLL's or libraries.
|
that go through the (dynamic) C runtime allocator, including those from other DLL's or
|
||||||
As it intercepts all allocation calls on a low level, it can be used reliably
|
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.
|
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).
|
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
|
2. Link your program explicitly with the `mimalloc.lib` export library for the `mimalloc.dll`.
|
||||||
call to the mimalloc API in the `main` function, like `mi_version()`
|
(which must be compiled with `-DMI_OVERRIDE=ON`, which is the default though).
|
||||||
(or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project
|
To ensure the `mimalloc.dll` is actually loaded at run-time it is easiest
|
||||||
for an example on how to use this.
|
to insert some call to the mimalloc API in the `main` function, like `mi_version()`
|
||||||
3. The [`mimalloc-redirect.dll`](bin) (or `mimalloc-redirect32.dll`) must be put
|
(or use the `/include:mi_version` switch on the linker command, or
|
||||||
in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
|
similarly, `#pragma comment(linker, "/include:mi_version")` in some source file).
|
||||||
The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
|
See the `mimalloc-test-override` project for an example on how to use this.
|
||||||
mimalloc functions (which reside in `mimalloc-override.dll`).
|
|
||||||
4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
|
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).
|
list of the final executable (so it can intercept all potential allocations).
|
||||||
|
You can use `minject -l <exe>` to check this if needed.
|
||||||
|
|
||||||
For best performance on Windows with C++, it
|
For best performance on Windows with C++, it
|
||||||
is also recommended to also override the `new`/`delete` operations (by including
|
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).
|
a single(!) source file in your project).
|
||||||
|
|
||||||
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
|
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
|
## Static override
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue