From e63c8aaa0511d1d0a5487c45dec9f8cbd66b4cc6 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 17 Sep 2014 17:21:13 +0200 Subject: [PATCH] On Linux, disable address space randomization --- nix/libstore/build.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc index 36c6ea8925..19d22ac374 100644 --- a/nix/libstore/build.cc +++ b/nix/libstore/build.cc @@ -57,9 +57,8 @@ #include #endif -#if HAVE_SYS_PERSONALITY_H +#if __linux__ #include -#define CAN_DO_LINUX32_BUILDS #endif #if HAVE_STATVFS @@ -1194,7 +1193,7 @@ static string get(const StringPairs & map, const string & key) static bool canBuildLocally(const string & platform) { return platform == settings.thisSystem -#ifdef CAN_DO_LINUX32_BUILDS +#if __linux__ || (platform == "i686-linux" && settings.thisSystem == "x86_64-linux") #endif ; @@ -2107,7 +2106,7 @@ void DerivationGoal::initChild() /* Close all other file descriptors. */ closeMostFDs(set()); -#ifdef CAN_DO_LINUX32_BUILDS +#if __linux__ /* Change the personality to 32-bit if we're doing an i686-linux build on an x86_64-linux machine. */ struct utsname utsbuf; @@ -2115,7 +2114,7 @@ void DerivationGoal::initChild() if (drv.platform == "i686-linux" && (settings.thisSystem == "x86_64-linux" || (!strcmp(utsbuf.sysname, "Linux") && !strcmp(utsbuf.machine, "x86_64")))) { - if (personality(0x0008 | 0x8000000 /* == PER_LINUX32_3GB */) == -1) + if (personality(PER_LINUX32_3GB) == -1) throw SysError("cannot set i686-linux personality"); } @@ -2125,6 +2124,11 @@ void DerivationGoal::initChild() int cur = personality(0xffffffff); if (cur != -1) personality(cur | 0x0020000 /* == UNAME26 */); } + + /* Disable address space randomization for improved + determinism. */ + int cur = personality(0xffffffff); + if (cur != -1) personality(cur | ADDR_NO_RANDOMIZE); #endif /* Fill in the environment. */