Upon starting a build using IL2CPP, Unity automatically performs the following steps:
Compiles Unity Scripting API code to regular .NET DLLs (managed assemblies).
Applies managed bytecode stripping. This step significantly reduces the size of a built game.
Converts all managed assemblies to standard C++ code.
Compiles the generated C++ code and the runtime part of IL2CPP with a native platform compiler.
Links the code into either an executable file or a DLL, depending on the platform you are targeting.
IL2CPP provides a few useful options which you can control by attributes in your scripts. See documentation on Platform-dependent compilation for further information.