mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-08 00:09:31 +03:00
update redirection modules to v1.3
This commit is contained in:
parent
27d929f338
commit
130227e399
6 changed files with 41 additions and 14 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -5,24 +5,26 @@ is robust and has the particular advantage to be able to redirect all malloc/fre
|
||||||
the (dynamic) C runtime allocator, including those from other DLL's or libraries.
|
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
|
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.
|
2. Link your program explicitly with the `mimalloc-override.lib` export library for
|
||||||
To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some
|
the `mimalloc-override.dll` -- which contains all mimalloc functionality.
|
||||||
|
To ensure the `mimalloc-override.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()`
|
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).
|
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.
|
See the `mimalloc-override-test` 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
|
3. The `mimalloc-redirect.dll` must be put in the same folder as the main
|
||||||
in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
|
`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
|
The redirection DLL ensures that all calls to the C runtime malloc API get
|
||||||
mimalloc functions (which reside in `mimalloc-override.dll`).
|
redirected to mimalloc functions (which reside in `mimalloc-override.dll`).
|
||||||
|
|
||||||
4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
|
4. Ensure the `mimalloc-override.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
|
||||||
|
@ -32,17 +34,39 @@ 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.
|
||||||
|
|
||||||
## Minject
|
### Other Platforms
|
||||||
|
|
||||||
|
You always link with `mimalloc-override.dll` but for different platforms you may
|
||||||
|
need a specific `mimalloc-redirect.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-override.lib` export library.
|
||||||
|
2. Now separately build `mimalloc-override.dll` in `arm64ec` mode and _overwrite_ your
|
||||||
|
previous (x64) `mimalloc-override.dll` -- the loader can handle the mix of arm64ec
|
||||||
|
and x64 code. Now use `mimalloc-redirect-arm64ec.dll` in this case to match your
|
||||||
|
arm64ec `mimalloc-override.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
|
||||||
|
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-override.dll`, and similarly, we cannot always
|
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.
|
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 `mimalloc-override.dll`
|
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)
|
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).
|
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
|
||||||
(or `minject32` for 32-bit PE files, or `minject-arm64` on arm64 Windows).
|
|
||||||
Use `minject --help` for options:
|
Use `minject --help` for options:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -72,3 +96,6 @@ examples:
|
||||||
> minject --list myprogram.exe
|
> minject --list myprogram.exe
|
||||||
> minject --force --inplace myprogram.exe
|
> minject --force --inplace myprogram.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For x86 32-bit binaries, use `minject32`, and for arm64 binaries use `minject-arm64`.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue