* heap.cc (eval_start_address): New static function to evaluate the
best start address for the application heap. (heap_init): Call eval_start_address to fetch the start value for start_address. Move preceeding comment to eval_start_address.
This commit is contained in:
		
							parent
							
								
									8a7b0a00df
								
							
						
					
					
						commit
						86719a10d0
					
				| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
2011-07-21  Corinna Vinschen  <corinna@vinschen.de>
 | 
			
		||||
 | 
			
		||||
	* heap.cc (eval_start_address): New static function to evaluate the
 | 
			
		||||
	best start address for the application heap.
 | 
			
		||||
	(heap_init): Call eval_start_address to fetch the start value for
 | 
			
		||||
	start_address.  Move preceeding comment to eval_start_address.
 | 
			
		||||
 | 
			
		||||
2011-07-21  Yaakov Selkowitz  <yselkowitz@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	* cygwin.din (pthread_condattr_getclock): Export.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,34 @@ static unsigned page_const;
 | 
			
		|||
 | 
			
		||||
#define MINHEAP_SIZE (4 * 1024 * 1024)
 | 
			
		||||
 | 
			
		||||
static uintptr_t
 | 
			
		||||
eval_start_address ()
 | 
			
		||||
{
 | 
			
		||||
  /* Starting with Vista, Windows performs heap ASLR.  This spoils the entire
 | 
			
		||||
     region below 0x20000000 for us, because that region is used by Windows
 | 
			
		||||
     to randomize heap and stack addresses.  Therefore we put our heap into a
 | 
			
		||||
     safe region starting at 0x20000000.  This should work right from the start
 | 
			
		||||
     in 99% of the cases. */
 | 
			
		||||
  uintptr_t start_address = 0x20000000L;
 | 
			
		||||
  if (wincap.is_wow64 ())
 | 
			
		||||
    {
 | 
			
		||||
      /* However, if we're running on a 64 bit system, we test here if the
 | 
			
		||||
	 executable is large address aware.  If so, the application gets a
 | 
			
		||||
	 4 Gigs virtual address space, with almost all of the upper 2 Gigs
 | 
			
		||||
	 being unused by Windows (only PEB and TEBs are allocated here,
 | 
			
		||||
	 apparently).  So what we do here is to test if the large address
 | 
			
		||||
	 awareness flag is set in the file header and, if so, allocate our
 | 
			
		||||
	 heap in that region.  What we get are 1.999 Gigs free for heap,
 | 
			
		||||
	 thread stacks, and shared memory regions. */
 | 
			
		||||
      PIMAGE_DOS_HEADER idh = (PIMAGE_DOS_HEADER) GetModuleHandle (NULL);
 | 
			
		||||
      PIMAGE_NT_HEADERS32 inh = (PIMAGE_NT_HEADERS32)
 | 
			
		||||
				((PBYTE) idh + idh->e_lfanew);
 | 
			
		||||
      if (inh->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)
 | 
			
		||||
	start_address = 0x80000000L;
 | 
			
		||||
    }
 | 
			
		||||
  return start_address;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Initialize the heap at process start up.  */
 | 
			
		||||
void
 | 
			
		||||
heap_init ()
 | 
			
		||||
| 
						 | 
				
			
			@ -36,13 +64,7 @@ heap_init ()
 | 
			
		|||
  page_const = wincap.page_size ();
 | 
			
		||||
  if (!cygheap->user_heap.base)
 | 
			
		||||
    {
 | 
			
		||||
      /* Starting with Vista, Windows performs heap ASLR.  This spoils
 | 
			
		||||
	 the entire region below 0x20000000 for us, because that region
 | 
			
		||||
	 is used by Windows to randomize heap and stack addresses.
 | 
			
		||||
	 Therefore we put our heap into a safe region starting at 0x20000000.
 | 
			
		||||
	 This should work right from the start in 99% of the cases.  But,
 | 
			
		||||
	 there's always a but.  Read on... */
 | 
			
		||||
      uintptr_t start_address = 0x20000000L;
 | 
			
		||||
      uintptr_t start_address = eval_start_address ();
 | 
			
		||||
      PVOID largest_found = NULL;
 | 
			
		||||
      size_t largest_found_size = 0;
 | 
			
		||||
      SIZE_T ret;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue