Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 86e600c

Browse files
gbalykovjkotas
authored andcommitted
Add custom default base address option to crossgen (#25227)
* Add crossgen option to setup default base address for native image This is enabled only with -DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION. * Mmap native images at default base address if env variable COMPlus_UseDefaultBaseAddr=0x1 is setup. This is enabled only with -DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION.
1 parent 9bd2787 commit 86e600c

File tree

9 files changed

+81
-3
lines changed

9 files changed

+81
-3
lines changed

clrdefinitions.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ endif ()
196196
if (FEATURE_NGEN_RELOCS_OPTIMIZATIONS)
197197
add_definitions(-DFEATURE_NGEN_RELOCS_OPTIMIZATIONS)
198198
endif(FEATURE_NGEN_RELOCS_OPTIMIZATIONS)
199+
if (FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
200+
add_definitions(-DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
201+
endif(FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
199202
add_definitions(-DFEATURE_SVR_GC)
200203
add_definitions(-DFEATURE_SYMDIFF)
201204
add_definitions(-DFEATURE_TIERED_COMPILATION)

src/inc/zapper.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class Zapper
129129

130130
SString m_outputFilename;
131131

132+
SIZE_T m_customBaseAddress;
133+
132134
public:
133135

134136
struct assemblyDependencies
@@ -362,6 +364,9 @@ class Zapper
362364
void SetOutputFilename(LPCWSTR pwszOutputFilename);
363365
SString GetOutputFileName();
364366

367+
void SetCustomBaseAddress(SIZE_T baseAddress);
368+
SIZE_T GetCustomBaseAddress();
369+
365370
private:
366371

367372
void DestroyDomain();

src/pal/src/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
123123
)
124124
endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
125125

126+
if (FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
127+
add_definitions(-DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
128+
endif(FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
126129
add_definitions(-DPLATFORM_UNIX)
127130
add_definitions(-DLP64COMPATIBLE)
128131
add_definitions(-DFEATURE_PAL)

src/pal/src/include/pal/init.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ extern Volatile<INT> init_count;
4141

4242
extern SIZE_T g_defaultStackSize;
4343

44+
extern BOOL g_useDefaultBaseAddr;
45+
4446
/*++
4547
MACRO:
4648
PALIsInitialized

src/pal/src/init/pal.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ static pthread_mutex_t init_critsec_mutex = PTHREAD_MUTEX_INITIALIZER;
104104
// The default minimum stack size
105105
SIZE_T g_defaultStackSize = 0;
106106

107+
// The default value of parameter, whether to mmap images at default base address or not
108+
BOOL g_useDefaultBaseAddr = FALSE;
109+
107110
/* critical section to protect access to init_count. This is allocated on the
108111
very first PAL_Initialize call, and is freed afterward. */
109112
static PCRITICAL_SECTION init_critsec = NULL;
@@ -382,6 +385,22 @@ Initialize(
382385
}
383386
#endif // ENSURE_PRIMARY_STACK_SIZE
384387

388+
#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
389+
char* useDefaultBaseAddr = getenv("COMPlus_UseDefaultBaseAddr");
390+
if (useDefaultBaseAddr != NULL)
391+
{
392+
errno = 0;
393+
// Like all numeric values specific by the COMPlus_xxx variables, it is a
394+
// hexadecimal string without any prefix.
395+
long int flag = strtol(useDefaultBaseAddr, NULL, 16);
396+
397+
if (errno == 0)
398+
{
399+
g_useDefaultBaseAddr = (BOOL) flag;
400+
}
401+
}
402+
#endif // FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
403+
385404
// Initialize the TLS lookaside cache
386405
if (FALSE == TLSInitialize())
387406
{

src/pal/src/map/map.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2350,9 +2350,16 @@ void * MAPMapPEFile(HANDLE hFile)
23502350

23512351
if (loadedBase == NULL)
23522352
{
2353+
void *usedBaseAddr = NULL;
2354+
#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
2355+
if (g_useDefaultBaseAddr)
2356+
{
2357+
usedBaseAddr = (void*) preferredBase;
2358+
}
2359+
#endif // FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
23532360
// MAC64 requires we pass MAP_SHARED (or MAP_PRIVATE) flags - otherwise, the call is failed.
23542361
// Refer to mmap documentation at http://www.manpagez.com/man/2/mmap/ for details.
2355-
loadedBase = mmap(NULL, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
2362+
loadedBase = mmap(usedBaseAddr, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
23562363
}
23572364

23582365
if (MAP_FAILED == loadedBase)

src/tools/crossgen/crossgen.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ enum ReturnValues
3434
#define NumItems(s) (sizeof(s) / sizeof(s[0]))
3535

3636
STDAPI CreatePDBWorker(LPCWSTR pwzAssemblyPath, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzAppNiPaths, LPCWSTR pwzPdbPath, BOOL fGeneratePDBLinesInfo, LPCWSTR pwzManagedPdbSearchPath, LPCWSTR pwzPlatformWinmdPaths, LPCWSTR pwzDiasymreaderPath);
37-
STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzOutputFilename=NULL, LPCWSTR pwzPlatformWinmdPaths=NULL, ICorSvcLogger *pLogger = NULL, LPCWSTR pwszCLRJITPath = nullptr);
37+
STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzOutputFilename=NULL, SIZE_T customBaseAddress=0, LPCWSTR pwzPlatformWinmdPaths=NULL, ICorSvcLogger *pLogger = NULL, LPCWSTR pwszCLRJITPath = nullptr);
3838
void SetSvcLogger(ICorSvcLogger *pCorSvcLogger);
3939
void SetMscorlibPath(LPCWSTR wzSystemDirectory);
4040

@@ -155,6 +155,9 @@ void PrintUsageHelper()
155155
W(" input assemblies\n")
156156

157157
#endif
158+
#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
159+
W(" /BaseAddress <value> - Specifies base address to use for compilation.\n")
160+
#endif
158161
#ifdef FEATURE_WINMD_RESILIENT
159162
W(" WinMD Parameters\n")
160163
W(" /WinMDResilient - Generate images resilient to WinMD dependency changes.\n")
@@ -436,6 +439,7 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
436439
LPCWSTR pwzOutputFilename = NULL;
437440
LPCWSTR pwzPublicKeys = nullptr;
438441
bool fLargeVersionBubbleSwitch = false;
442+
SIZE_T baseAddress = 0;
439443

440444
#if !defined(FEATURE_MERGE_JIT_AND_ENGINE)
441445
LPCWSTR pwszCLRJITPath = nullptr;
@@ -543,6 +547,19 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
543547
dwFlags |= NGENWORKER_FLAGS_LARGEVERSIONBUBBLE;
544548
fLargeVersionBubbleSwitch = true;
545549
}
550+
#endif
551+
#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
552+
else if (MatchParameter(*argv, W("BaseAddress")))
553+
{
554+
if (baseAddress != 0)
555+
{
556+
OutputErr(W("Cannot specify multiple base addresses.\n"));
557+
exit(INVALID_ARGUMENTS);
558+
}
559+
baseAddress = (SIZE_T) _wcstoui64(argv[1], NULL, 0);
560+
argv++;
561+
argc--;
562+
}
546563
#endif
547564
else if (MatchParameter(*argv, W("NoMetaData")))
548565
{
@@ -942,6 +959,7 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
942959
pwzPlatformResourceRoots,
943960
pwzAppPaths,
944961
pwzOutputFilename,
962+
baseAddress,
945963
pwzPlatformWinmdPaths
946964
#if !defined(FEATURE_MERGE_JIT_AND_ENGINE)
947965
,

src/zap/zapimage.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,12 @@ void ZapImage::CalculateZapBaseAddress()
12821282
}
12831283
}
12841284

1285+
if (m_zapper->GetCustomBaseAddress() != 0)
1286+
{
1287+
//set baseAddress here from crossgen options
1288+
baseAddress = m_zapper->GetCustomBaseAddress();
1289+
}
1290+
12851291
// Round to a multiple of 64K
12861292
// 64K is the allocation granularity of VirtualAlloc. (Officially this number is not a constant -
12871293
// we should be querying the system for its allocation granularity, but we do this all over the place

src/zap/zapper.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static bool s_fNGenNoMetaData;
3333
// Zapper Object instead of creating one on your own.
3434

3535

36-
STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzOutputFilename=NULL, LPCWSTR pwzPlatformWinmdPaths=NULL, ICorSvcLogger *pLogger = NULL, LPCWSTR pwszCLRJITPath = nullptr)
36+
STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzOutputFilename=NULL, SIZE_T customBaseAddress=0, LPCWSTR pwzPlatformWinmdPaths=NULL, ICorSvcLogger *pLogger = NULL, LPCWSTR pwszCLRJITPath = nullptr)
3737
{
3838
HRESULT hr = S_OK;
3939

@@ -83,6 +83,8 @@ STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembl
8383
if (pwzOutputFilename)
8484
zap->SetOutputFilename(pwzOutputFilename);
8585

86+
zap->SetCustomBaseAddress(customBaseAddress);
87+
8688
if (pwzPlatformAssembliesPaths != nullptr)
8789
zap->SetPlatformAssembliesPaths(pwzPlatformAssembliesPaths);
8890

@@ -408,6 +410,8 @@ void Zapper::Init(ZapperOptions *pOptions, bool fFreeZapperOptions)
408410
m_pAssemblyEmit = NULL;
409411
m_fFreeZapperOptions = fFreeZapperOptions;
410412

413+
m_customBaseAddress = 0;
414+
411415
#ifdef LOGGING
412416
InitializeLogging();
413417
#endif
@@ -1688,3 +1692,14 @@ SString Zapper::GetOutputFileName()
16881692
{
16891693
return m_outputFilename;
16901694
}
1695+
1696+
1697+
void Zapper::SetCustomBaseAddress(SIZE_T baseAddress)
1698+
{
1699+
m_customBaseAddress = baseAddress;
1700+
}
1701+
1702+
SIZE_T Zapper::GetCustomBaseAddress()
1703+
{
1704+
return m_customBaseAddress;
1705+
}

0 commit comments

Comments
 (0)