1 /* Disable address space randomization based on inferior personality. 2 3 Copyright (C) 2008-2019 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "common/common-defs.h" 21 #include "nat/linux-personality.h" 22 23 #ifdef HAVE_PERSONALITY 24 # include <sys/personality.h> 25 # if !HAVE_DECL_ADDR_NO_RANDOMIZE 26 # define ADDR_NO_RANDOMIZE 0x0040000 27 # endif /* ! HAVE_DECL_ADDR_NO_RANDOMIZE */ 28 #endif /* HAVE_PERSONALITY */ 29 30 /* See comment on nat/linux-personality.h. */ 31 32 maybe_disable_address_space_randomization:: 33 maybe_disable_address_space_randomization (int disable_randomization) 34 : m_personality_set (false), 35 m_personality_orig (0) 36 { 37 #ifdef HAVE_PERSONALITY 38 if (disable_randomization) 39 { 40 errno = 0; 41 m_personality_orig = personality (0xffffffff); 42 if (errno == 0 && !(m_personality_orig & ADDR_NO_RANDOMIZE)) 43 { 44 m_personality_set = true; 45 personality (m_personality_orig | ADDR_NO_RANDOMIZE); 46 } 47 if (errno != 0 || (m_personality_set 48 && !(personality (0xffffffff) & ADDR_NO_RANDOMIZE))) 49 warning (_("Error disabling address space randomization: %s"), 50 safe_strerror (errno)); 51 } 52 #endif /* HAVE_PERSONALITY */ 53 } 54 55 maybe_disable_address_space_randomization:: 56 ~maybe_disable_address_space_randomization () 57 { 58 #ifdef HAVE_PERSONALITY 59 60 if (m_personality_set) 61 { 62 errno = 0; 63 personality (m_personality_orig); 64 if (errno != 0) 65 warning (_("Error restoring address space randomization: %s"), 66 safe_strerror (errno)); 67 } 68 #endif /* HAVE_PERSONALITY */ 69 } 70