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

Commit 35af2b9

Browse files
committed
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 2273ccf commit 35af2b9

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

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)

0 commit comments

Comments
 (0)