--- gcc/config/host-linux.c | 6 +++++- gcc/ggc-common.c | 2 ++ gcc/ggc-page.c | 2 +- gcc/ggc-zone.c | 2 +- gcc/ggc.h | 7 +++++++ gcc/opts.c | 5 ++++- 6 files changed, 20 insertions(+), 4 deletions(-) Index: gcc-4.1.2.orig/gcc/config/host-linux.c =================================================================== --- gcc-4.1.2.orig.orig/gcc/config/host-linux.c 2005-08-01 10:43:33.000000000 -0700 +++ gcc-4.1.2.orig/gcc/config/host-linux.c 2007-06-26 15:47:07.000000000 -0700 @@ -27,6 +27,10 @@ #include "hosthooks-def.h" +#ifndef MAP_NOZERO +#define MAP_NOZERO 0x04000000 +#endif + /* Linux has a feature called exec-shield-randomize that perturbs the address of non-fixed mapped segments by a (relatively) small amount. The feature is intended to make it harder to attack the system with @@ -189,7 +193,7 @@ /* Try to make an anonymous private mmap at the desired location. */ addr = mmap (base, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS | MAP_NOZERO, -1, 0); if (addr != base) { Index: gcc-4.1.2.orig/gcc/ggc-common.c =================================================================== --- gcc-4.1.2.orig.orig/gcc/ggc-common.c 2005-06-24 19:02:01.000000000 -0700 +++ gcc-4.1.2.orig/gcc/ggc-common.c 2007-06-26 15:47:07.000000000 -0700 @@ -64,6 +64,8 @@ /* When set, ggc_collect will do collection. */ bool ggc_force_collect; +unsigned int mmap_flags = MAP_NOZERO; + /* Statistics about the allocation. */ static ggc_statistics *ggc_stats; Index: gcc-4.1.2.orig/gcc/ggc.h =================================================================== --- gcc-4.1.2.orig.orig/gcc/ggc.h 2005-09-06 20:50:08.000000000 -0700 +++ gcc-4.1.2.orig/gcc/ggc.h 2007-06-26 15:47:07.000000000 -0700 @@ -23,6 +23,13 @@ #define GCC_GGC_H #include "statistics.h" +#ifndef MAP_NOZERO +#define MAP_NOZERO 0x04000000 +#endif + +extern unsigned int mmap_flags; + + /* Symbols are marked with `ggc' for `gcc gc' so as not to interfere with an external gc library that might be linked in. */ Index: gcc-4.1.2.orig/gcc/ggc-page.c =================================================================== --- gcc-4.1.2.orig.orig/gcc/ggc-page.c 2005-09-06 20:50:08.000000000 -0700 +++ gcc-4.1.2.orig/gcc/ggc-page.c 2007-06-26 15:47:07.000000000 -0700 @@ -662,7 +662,7 @@ { #ifdef HAVE_MMAP_ANON char *page = mmap (pref, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS | mmap_flags, -1, 0); #endif #ifdef HAVE_MMAP_DEV_ZERO char *page = mmap (pref, size, PROT_READ | PROT_WRITE, Index: gcc-4.1.2.orig/gcc/ggc-zone.c =================================================================== --- gcc-4.1.2.orig.orig/gcc/ggc-zone.c 2005-07-25 08:14:21.000000000 -0700 +++ gcc-4.1.2.orig/gcc/ggc-zone.c 2007-06-26 15:47:07.000000000 -0700 @@ -769,7 +769,7 @@ { #ifdef HAVE_MMAP_ANON char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS | mmap_flags, -1, 0); #endif #ifdef HAVE_MMAP_DEV_ZERO char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE, Index: gcc-4.1.2.orig/gcc/opts.c =================================================================== --- gcc-4.1.2.orig.orig/gcc/opts.c 2006-05-17 11:38:58.000000000 -0700 +++ gcc-4.1.2.orig/gcc/opts.c 2007-06-26 15:47:07.000000000 -0700 @@ -278,7 +278,10 @@ const struct cl_option *option; opt = argv[0]; - + if (strcmp(opt, "-mmap-zero") == 0) { + mmap_flags &= ~MAP_NOZERO; + return 1; + } opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET); if (opt_index == cl_options_count && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')