This is the mail archive of the
mailing list for the GCC project.
[Patch] Fix for PCH on MS Vist host, committed
- From: Danny Smith <dannysmith at clear dot net dot nz>
- To: GCC-patches <gcc-patches at gcc dot gnu dot org>
- Cc: Christoph_vW at reactos dot org
- Date: Wed, 18 Jul 2007 23:39:45 +1200
- Subject: [Patch] Fix for PCH on MS Vist host, committed
I have committed the following patch to fix problems with PCH on mingw32
running as Terminal Service on MS Vista version of Windows.
007-07-19 Christoph von Wittich <Christoph_vW@reactos.org>
Danny Smith <firstname.lastname@example.org>
* config/i386/host-mingw32.c (mingw32_gt_pch_use_address): Put
file mapping object in local namespace if Windows version later
--- config/i386/host-mingw32.c (revision 126718)
+++ config/i386/host-mingw32.c (working copy)
@@ -1,5 +1,5 @@
/* mingw32 host-specific hook definitions.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2007 Free Software Foundation, Inc.
This file is part of GCC.
@@ -87,11 +87,11 @@
/* FIXME: We let system determine base by setting first arg to NULL.
Allocating at top of available address space avoids unnecessary
- fragmentation of "ordinary" (malloc's) address space but may not
- with delayed load of system dll's. Preferred addresses for NT
- dlls is in 0x70000000 to 0x78000000 range.
- If we allocate at bottom we need to reserve the address as early
- and at the same point in each invocation. */
+ fragmentation of "ordinary" (malloc's) address space but may not
+ be safe with delayed load of system dll's. Preferred addresses
+ for NT system dlls is in 0x70000000 to 0x78000000 range.
+ If we allocate at bottom we need to reserve the address as early
+ as possible and at the same point in each invocation. */
res = VirtualAlloc (NULL, pch_VA_max_size,
MEM_RESERVE | MEM_TOP_DOWN,
@@ -115,19 +115,36 @@
void * mmap_addr;
- static HANDLE mmap_handle;
+ HANDLE mmap_handle;
- if (size == 0)
- return 0;
+ /* Apparently, MS Vista puts unnamed file mapping objects into Global
+ namespace when running an application in a Terminal Server
+ session. This causes failure since, by default, applications
+ don't get SeCreateGlobalPrivilege. We don't need global
+ memory sharing so explicitly put object into Local namespace. */
+ const char object_name = "Local\\MinGWGCCPCH";
+ /* However, the documentation for CreateFileMapping says that on NT4
+ and earlier, backslashes are invalid in object name. So, we need
+ to check if we are on Windows2000 or higher. */
+ OSVERSIONINFO version_info;
+ if (size == 0)
+ return 0;
/* Offset must be also be a multiple of allocation granularity for
this to work. We can't change the offset. */
if ((offset & (va_granularity - 1)) != 0 || size > pch_VA_max_size)
- mmap_handle = CreateFileMapping ((HANDLE) _get_osfhandle (fd),
- NULL, PAGE_WRITECOPY | SEC_COMMIT,
- 0, 0, NULL);
+ /* Determine the version of Windows we are running on. */
+ version_info.dwOSVersionInfoSize = sizeof (version_info);
+ GetVersionEx (&version_info);
+ mmap_handle = CreateFileMappingA ((HANDLE) _get_osfhandle (fd), NULL,
+ PAGE_WRITECOPY | SEC_COMMIT, 0, 0,
+ version_info.dwMajorVersion > 4
+ ? object_name : NULL);
if (mmap_handle == NULL)
w32_error (__FUNCTION__, __FILE__, __LINE__,