diff options
Diffstat (limited to 'src/pal/src/map/map.cpp')
-rw-r--r-- | src/pal/src/map/map.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/pal/src/map/map.cpp b/src/pal/src/map/map.cpp index 5fdb6fda38..b8ffc84db4 100644 --- a/src/pal/src/map/map.cpp +++ b/src/pal/src/map/map.cpp @@ -246,7 +246,7 @@ FileMappingInitializationRoutine( pProcessLocalData->UnixFd = InternalOpen( pImmutableData->szFileName, - MAPProtectionToFileOpenFlags(pImmutableData->flProtect) + MAPProtectionToFileOpenFlags(pImmutableData->flProtect) | O_CLOEXEC ); if (-1 == pProcessLocalData->UnixFd) @@ -510,7 +510,7 @@ CorUnix::InternalCreateFileMapping( #if HAVE_MMAP_DEV_ZERO - UnixFd = InternalOpen(pImmutableData->szFileName, O_RDWR); + UnixFd = InternalOpen(pImmutableData->szFileName, O_RDWR | O_CLOEXEC); if ( -1 == UnixFd ) { ERROR( "Unable to open the file.\n"); @@ -587,7 +587,7 @@ CorUnix::InternalCreateFileMapping( // information, though... // - UnixFd = dup(pFileLocalData->unix_fd); + UnixFd = fcntl(pFileLocalData->unix_fd, F_DUPFD_CLOEXEC, 0); // dup, but with CLOEXEC if (-1 == UnixFd) { ERROR( "Unable to duplicate the Unix file descriptor!\n" ); @@ -2440,20 +2440,21 @@ void * MAPMapPEFile(HANDLE hFile) // We're going to start adding mappings to the mapping list, so take the critical section InternalEnterCriticalSection(pThread, &mapping_critsec); -#if !defined(_AMD64_) - loadedBase = mmap((void*)preferredBase, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0); -#else // defined(_AMD64_) +#ifdef BIT64 // First try to reserve virtual memory using ExecutableAllcator. This allows all PE images to be // near each other and close to the coreclr library which also allows the runtime to generate - // more efficient code (by avoiding usage of jump stubs). - loadedBase = ReserveMemoryFromExecutableAllocator(pThread, ALIGN_UP(virtualSize, GetVirtualPageSize())); + // more efficient code (by avoiding usage of jump stubs). Alignment to a 64 KB granularity should + // not be necessary (alignment to page size should be sufficient), but see + // ExecutableMemoryAllocator::AllocateMemory() for the reason why it is done. + loadedBase = ReserveMemoryFromExecutableAllocator(pThread, ALIGN_UP(virtualSize, VIRTUAL_64KB)); +#endif // BIT64 + if (loadedBase == NULL) { // 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((void*)preferredBase, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0); + loadedBase = mmap(NULL, virtualSize, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0); } -#endif // !defined(_AMD64_) if (MAP_FAILED == loadedBase) { |