if (FEATURE_NGEN_RELOCS_OPTIMIZATIONS)
add_definitions(-DFEATURE_NGEN_RELOCS_OPTIMIZATIONS)
endif(FEATURE_NGEN_RELOCS_OPTIMIZATIONS)
+if (FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
+ add_definitions(-DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
+endif(FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
add_definitions(-DFEATURE_SVR_GC)
add_definitions(-DFEATURE_SYMDIFF)
add_definitions(-DFEATURE_TIERED_COMPILATION)
SString m_outputFilename;
+ SIZE_T m_customBaseAddress;
+
public:
struct assemblyDependencies
void SetOutputFilename(LPCWSTR pwszOutputFilename);
SString GetOutputFileName();
+ void SetCustomBaseAddress(SIZE_T baseAddress);
+ SIZE_T GetCustomBaseAddress();
+
private:
void DestroyDomain();
)
endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+if (FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
+ add_definitions(-DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
+endif(FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION)
add_definitions(-DPLATFORM_UNIX)
add_definitions(-DLP64COMPATIBLE)
add_definitions(-DFEATURE_PAL)
extern SIZE_T g_defaultStackSize;
+extern BOOL g_useDefaultBaseAddr;
+
/*++
MACRO:
PALIsInitialized
// The default minimum stack size
SIZE_T g_defaultStackSize = 0;
+// The default value of parameter, whether to mmap images at default base address or not
+BOOL g_useDefaultBaseAddr = FALSE;
+
/* critical section to protect access to init_count. This is allocated on the
very first PAL_Initialize call, and is freed afterward. */
static PCRITICAL_SECTION init_critsec = NULL;
}
#endif // ENSURE_PRIMARY_STACK_SIZE
+#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
+ char* useDefaultBaseAddr = getenv("COMPlus_UseDefaultBaseAddr");
+ if (useDefaultBaseAddr != NULL)
+ {
+ errno = 0;
+ // Like all numeric values specific by the COMPlus_xxx variables, it is a
+ // hexadecimal string without any prefix.
+ long int flag = strtol(useDefaultBaseAddr, NULL, 16);
+
+ if (errno == 0)
+ {
+ g_useDefaultBaseAddr = (BOOL) flag;
+ }
+ }
+#endif // FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
+
// Initialize the TLS lookaside cache
if (FALSE == TLSInitialize())
{
if (loadedBase == NULL)
{
+ void *usedBaseAddr = NULL;
+#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
+ if (g_useDefaultBaseAddr)
+ {
+ usedBaseAddr = (void*) preferredBase;
+ }
+#endif // FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
// MAC64 requires we pass MAP_SHARED (or MAP_PRIVATE) flags - otherwise, the call is failed.
// Refer to mmap documentation at http://www.manpagez.com/man/2/mmap/ for details.
- loadedBase = mmap(NULL, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
+ loadedBase = mmap(usedBaseAddr, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
}
if (MAP_FAILED == loadedBase)
#define NumItems(s) (sizeof(s) / sizeof(s[0]))
STDAPI CreatePDBWorker(LPCWSTR pwzAssemblyPath, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzAppNiPaths, LPCWSTR pwzPdbPath, BOOL fGeneratePDBLinesInfo, LPCWSTR pwzManagedPdbSearchPath, LPCWSTR pwzPlatformWinmdPaths, LPCWSTR pwzDiasymreaderPath);
-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);
+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);
void SetSvcLogger(ICorSvcLogger *pCorSvcLogger);
void SetMscorlibPath(LPCWSTR wzSystemDirectory);
W(" input assemblies\n")
#endif
+#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
+ W(" /BaseAddress <value> - Specifies base address to use for compilation.\n")
+#endif
#ifdef FEATURE_WINMD_RESILIENT
W(" WinMD Parameters\n")
W(" /WinMDResilient - Generate images resilient to WinMD dependency changes.\n")
LPCWSTR pwzOutputFilename = NULL;
LPCWSTR pwzPublicKeys = nullptr;
bool fLargeVersionBubbleSwitch = false;
+ SIZE_T baseAddress = 0;
#if !defined(FEATURE_MERGE_JIT_AND_ENGINE)
LPCWSTR pwszCLRJITPath = nullptr;
fLargeVersionBubbleSwitch = true;
}
#endif
+#ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION
+ else if (MatchParameter(*argv, W("BaseAddress")))
+ {
+ if (baseAddress != 0)
+ {
+ OutputErr(W("Cannot specify multiple base addresses.\n"));
+ exit(INVALID_ARGUMENTS);
+ }
+ baseAddress = (SIZE_T) _wcstoui64(argv[1], NULL, 0);
+ argv++;
+ argc--;
+ }
+#endif
else if (MatchParameter(*argv, W("NoMetaData")))
{
dwFlags |= NGENWORKER_FLAGS_NO_METADATA;
pwzPlatformResourceRoots,
pwzAppPaths,
pwzOutputFilename,
+ baseAddress,
pwzPlatformWinmdPaths
#if !defined(FEATURE_MERGE_JIT_AND_ENGINE)
,
}
}
+ if (m_zapper->GetCustomBaseAddress() != 0)
+ {
+ //set baseAddress here from crossgen options
+ baseAddress = m_zapper->GetCustomBaseAddress();
+ }
+
// Round to a multiple of 64K
// 64K is the allocation granularity of VirtualAlloc. (Officially this number is not a constant -
// we should be querying the system for its allocation granularity, but we do this all over the place
// Zapper Object instead of creating one on your own.
-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)
+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)
{
HRESULT hr = S_OK;
if (pwzOutputFilename)
zap->SetOutputFilename(pwzOutputFilename);
+ zap->SetCustomBaseAddress(customBaseAddress);
+
if (pwzPlatformAssembliesPaths != nullptr)
zap->SetPlatformAssembliesPaths(pwzPlatformAssembliesPaths);
m_pAssemblyEmit = NULL;
m_fFreeZapperOptions = fFreeZapperOptions;
+ m_customBaseAddress = 0;
+
#ifdef LOGGING
InitializeLogging();
#endif
{
return m_outputFilename;
}
+
+
+void Zapper::SetCustomBaseAddress(SIZE_T baseAddress)
+{
+ m_customBaseAddress = baseAddress;
+}
+
+SIZE_T Zapper::GetCustomBaseAddress()
+{
+ return m_customBaseAddress;
+}
\ No newline at end of file