https://bugs.kde.org/show_bug.cgi?id=451843
Bug ID: 451843 Summary: valgrind fails to start on a FreeBSD system which enforces W^X. Product: valgrind Version: 3.18.1 Platform: FreeBSD Ports OS: FreeBSD Status: REPORTED Severity: critical Priority: NOR Component: memcheck Assignee: jsew...@acm.org Reporter: akami...@hotmail.com Target Milestone: --- SUMMARY *** NOTE: If you are reporting a crash, please try to attach a backtrace with debug symbols. See https://community.kde.org/Guidelines_and_HOWTOs/Debugging/How_to_create_useful_crash_reports *** valgrind fails to start on a FreeBSD system which enforces W^X. Looks like memcheck is trying to mmap with PROT_WRITE|PROT_EXEC, permissions. Is it really needed ? Or is there a option in Makefile to avoid this ? STEPS TO REPRODUCE 1. FreeBSD 13+ with W^X enforced "sysctl kern.elf64.allow_wx=0" 2. launch valgrind 3. OBSERVED RESULT ➜ ~ valgrind --version --23644:0: aspacem <<< SHOW_SEGMENTS: out_of_memory (15 segments) --23644:0: aspacem 1 segment names in 1 slots --23644:0: aspacem freelist is empty --23644:0: aspacem (0,4,5) /usr/local/libexec/valgrind/memcheck-amd64-freebsd --23644:0: aspacem 0: RSVN 0000000000-0003ffffff 64m ----- SmFixed --23644:0: aspacem 1: 0004000000-0037ffffff 832m --23644:0: aspacem 2: FILE 0038000000-00380c1fff 794624 r---- d=0x99ef79a8 i=329107 o=0 (0,4) --23644:0: aspacem 3: FILE 00380c2000-0038273fff 1777664 r-x-- d=0x99ef79a8 i=329107 o=790528 (0,4) --23644:0: aspacem 4: FILE 0038274000-0038274fff 4096 rw--- d=0x99ef79a8 i=329107 o=2564096 (0,4) --23644:0: aspacem 5: ANON 0038275000-003a849fff 37m rw--- --23644:0: aspacem 6: 003a84a000-0401ffffff 15479m --23644:0: aspacem 7: RSVN 0402000000-0402000fff 4096 ----- SmFixed --23644:0: aspacem 8: 0402001000-07ffffffff 16351m --23644:0: aspacem 9: RSVN 0800000000-0839075fff 912m ----- SmFixed --23644:0: aspacem 10: ANON 0839076000-0859055fff 511m ----- --23644:0: aspacem 11: ANON 0859056000-0859075fff 131072 rw--- --23644:0: aspacem 12: RSVN 0859076000-7fffffffefff 131038g ----- SmFixed --23644:0: aspacem 13: ANON 7ffffffff000-7fffffffffff 4096 r-x-- --23644:0: aspacem 14: RSVN 800000000000-ffffffffffffffff 16383e ----- SmFixed --23644:0: aspacem >>> --23644-- core : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB --23644-- dinfo : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB --23644-- (null) : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 0 rzB --23644-- demangle: 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB --23644-- ttaux : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB --23644-- translate: 0 guest insns, 0 traces, 0 uncond chased, 0 cond chased --23644-- translate: no SP updates identified --23644-- translate: PX: SPonly 0, UnwRegs 0, AllRegs 0, AllRegsAllInsns 0 --23644-- tt/tc: 0 tt lookups requiring 0 probes --23644-- tt/tc: 0 fast-cache updates, 0 flushes --23644-- transtab: new 0 (0 -> 0; ratio 0.0) [0 scs] avg tce size 0 --23644-- transtab: dumped 0 (0 -> ??) (sectors recycled 0) --23644-- transtab: discarded 0 (0 -> ??) --23644-- scheduler: 0 event checks. --23644-- scheduler: 0 indir transfers, 0 misses (1 in 0) .. --23644-- scheduler: .. of which: 0 hit0, 0 hit1, 0 hit2, 0 hit3, 0 missed --23644-- scheduler: 0/0 major/minor sched events. --23644-- sanity: 0 cheap, 0 expensive checks. ==23644== ==23644== Valgrind's memory management: out of memory: ==23644== newSuperblock's request for 4194304 bytes failed. ==23644== 576,544,768 bytes have already been mmap-ed ANONYMOUS. ==23644== Valgrind cannot continue. Sorry. ==23644== ==23644== There are several possible reasons for this. ==23644== - You have some kind of memory limit in place. Look at the ==23644== output of 'ulimit -a'. Is there a limit on the size of ==23644== virtual memory or address space? ==23644== - You have run out of swap space. ==23644== - Valgrind has a bug. If you think this is the case or you are ==23644== not sure, please let us know and we'll try to fix it. ==23644== Please note that programs can take substantially more memory than ==23644== normal when running under Valgrind tools, eg. up to twice or ==23644== more, depending on the tool. On a 64-bit machine, Valgrind ==23644== should be able to make use of up 32GB memory. On a 32-bit ==23644== machine, Valgrind should be able to use all the memory available ==23644== to a single process, up to 4GB if that's how you have your ==23644== kernel configured. Most 32-bit Linux setups allow a maximum of ==23644== 3GB per process. ==23644== ==23644== Whatever the reason, Valgrind cannot continue. Sorry. ➜ ~ proccontrol -m wxmap -s enable valgrind --version valgrind-3.18.1 EXPECTED RESULT valgrind should run SOFTWARE/OS VERSIONS Windows: macOS: Linux/KDE Plasma: (available in About System) KDE Plasma Version: KDE Frameworks Version: Qt Version: ADDITIONAL INFORMATION ➜ ~ truss valgrind --version mmap(0x0,135168,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34910072832 (0x820cd7000) mprotect(0x2c10a2f36000,4096,PROT_READ) = 0 (0x0) issetugid() = 0 (0x0) sigfastblock(0x1,0x2c10a2f38ad0) = 0 (0x0) open("/etc/libmap.conf",O_RDONLY|O_CLOEXEC,04063320030) = 3 (0x3) fstat(3,{ mode=-rw-r--r-- ,inode=4195,size=47,blksize=4096 }) = 0 (0x0) read(3,"# $FreeBSD$\nincludedir /usr/loc"...,47) = 47 (0x2f) close(3) = 0 (0x0) open("/usr/local/etc/libmap.d",O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC,0165) = 3 (0x3) fcntl(3,F_ISUNIONSTACK,0x0) = 0 (0x0) getdirentries(3,"\M-j\M-O\^C\0\0\0\0\0\^A\0\0\0\0"...,4096,{ 0x0 }) = 104 (0x68) open("/usr/local/etc/libmap.d/mesa.conf",O_RDONLY|O_CLOEXEC,0165) = 4 (0x4) fstat(4,{ mode=-rw-r--r-- ,inode=491804,size=38,blksize=4096 }) = 0 (0x0) read(4,"libGLX_indirect.so.0 libGLX_mesa"...,38) = 38 (0x26) close(4) = 0 (0x0) getdirentries(3,0x820cdc008,4096,{ 0x1e14e5b3 }) = 0 (0x0) close(3) = 0 (0x0) open("/var/run/ld-elf.so.hints",O_RDONLY|O_CLOEXEC,010004427) = 3 (0x3) read(3,"Ehnt\^A\0\0\0\M^@\0\0\0\M-.\0\0"...,128) = 128 (0x80) fstat(3,{ mode=-r--r--r-- ,inode=331815,size=302,blksize=4096 }) = 0 (0x0) pread(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,174,0x80) = 174 (0xae) close(3) = 0 (0x0) open("/lib/libc.so.7",O_RDONLY|O_CLOEXEC|O_VERIFY,012320443000) = 3 (0x3) fstat(3,{ mode=-r--r--r-- ,inode=198291,size=2001624,blksize=131072 }) = 0 (0x0) mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34923339776 (0x82197e000) mmap(0x0,4296704,PROT_NONE,MAP_GUARD,-1,0x0) = 34932731904 (0x822273000) mmap(0x822273000,565248,PROT_READ,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34932731904 (0x822273000) mmap(0x8222fd000,1380352,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x89000) = 34933297152 (0x8222fd000) mmap(0x82244e000,40960,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x1d9000) = 34934677504 (0x82244e000) mmap(0x822458000,24576,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x1e2000) = 34934718464 (0x822458000) mmap(0x82245e000,2285568,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34934743040 (0x82245e000) munmap(0x82197e000,4096) = 0 (0x0) close(3) = 0 (0x0) mprotect(0x82244e000,36864,PROT_READ) = 0 (0x0) mprotect(0x82244e000,36864,PROT_READ|PROT_WRITE) = 0 (0x0) mprotect(0x82244e000,36864,PROT_READ) = 0 (0x0) readlink("/etc/malloc.conf",0x8209817f0,1024) ERR#2 'No such file or directory' issetugid() = 0 (0x0) __sysctl("vm.overcommit",2,0x82097fd7c,0x82097fd70,0x0,0) = 0 (0x0) mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(21),-1,0x0) = 34915483648 (0x821200000) mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0) = 34940534784 (0x8229e4000) mmap(0x0,4194304,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(21),-1,0x0) = 34949038080 (0x823200000) getpid() = 23675 (0x5c7b) __sysctl("kern.proc.pathname.23675",4,0x820982800,0x8209827f8,0x0,0) = 0 (0x0) execve("/usr/local/libexec/valgrind/memcheck-amd64-freebsd",0x820982c90,0x8229f0000) EJUSTRETURN __sysctl("sysctl.name2oid security.bsd.unprivileged_proc_debug",2,0x3a37f870,0x3a37f848,0x38019299,36) = 0 (0x0) __sysctl("security.bsd.unprivileged_proc_debug",3,0x3a37f960,0x3a37f968,0x0,0) = 0 (0x0) getpid() = 23675 (0x5c7b) __sysctl("kern.proc.vmmap.23675",4,0x3977ddb0,0x3a37f7d0,0x0,0) = 0 (0x0) mmap(0x402001000,4194304,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) ERR#13 'Permission denied' getpid() = 23675 (0x5c7b) --23675:0: aspacem <<< SHOW_SEGMENTS: out_of_memory (15 segments) write(2,"--23675:0: aspacem <<< SHOW_SEGM"...,66) = 66 (0x42) getpid() = 23675 (0x5c7b) --23675:0: aspacem 1 segment names in 1 slots write(2,"--23675:0: aspacem 1 segment nam"...,46) = 46 (0x2e) getpid() = 23675 (0x5c7b) --23675:0: aspacem freelist is empty write(2,"--23675:0: aspacem freelist is e"...,37) = 37 (0x25) getpid() = 23675 (0x5c7b) --23675:0: aspacem (0,4,5) /usr/local/libexec/valgrind/memcheck-amd64-freebsd write(2,"--23675:0: aspacem (0,4,5) /usr/"...,78) = 78 (0x4e) getpid() = 23675 (0x5c7b) --23675:0: aspacem 0: RSVN 0000000000-0003ffffff 64m ----- SmFixed write(2,"--23675:0: aspacem 0: RSVN 000"...,73) = 73 (0x49) getpid() = 23675 (0x5c7b) --23675:0: aspacem 1: 0004000000-0037ffffff 832m write(2,"--23675:0: aspacem 1: 000"...,59) = 59 (0x3b) getpid() = 23675 (0x5c7b) --23675:0: aspacem 2: FILE 0038000000-00380c1fff 794624 r---- d=0x99ef79a8 i=329107 o=write(2,"--23675:0: aspacem 2: FILE 003"...,90) = 90 (0x5a) 0 (0,4) write(2,"0 (0,4)\n",14) = 14 (0xe) getpid() = 23675 (0x5c7b) --23675:0: aspacem 3: FILE 00380c2000-0038273fff 1777664 r-x-- d=0x99ef79a8 i=329107 o=write(2,"--23675:0: aspacem 3: FILE 003"...,90) = 90 (0x5a) 790528 (0,4) write(2,"790528 (0,4)\n",14) = 14 (0xe) getpid() = 23675 (0x5c7b) --23675:0: aspacem 4: FILE 0038274000-0038274fff 4096 rw--- d=0x99ef79a8 i=329107 o=write(2,"--23675:0: aspacem 4: FILE 003"...,90) = 90 (0x5a) 2564096 (0,4) write(2,"2564096 (0,4)\n",14) = 14 (0xe) getpid() = 23675 (0x5c7b) --23675:0: aspacem 5: ANON 0038275000-003a849fff 37m rw--- write(2,"--23675:0: aspacem 5: ANON 003"...,65) = 65 (0x41) getpid() = 23675 (0x5c7b) --23675:0: aspacem 6: 003a84a000-0401ffffff 15479m write(2,"--23675:0: aspacem 6: 003"...,59) = 59 (0x3b) getpid() = 23675 (0x5c7b) --23675:0: aspacem 7: RSVN 0402000000-0402000fff 4096 ----- SmFixed write(2,"--23675:0: aspacem 7: RSVN 040"...,73) = 73 (0x49) getpid() = 23675 (0x5c7b) --23675:0: aspacem 8: 0402001000-07ffffffff 16351m write(2,"--23675:0: aspacem 8: 040"...,59) = 59 (0x3b) getpid() = 23675 (0x5c7b) --23675:0: aspacem 9: RSVN 0800000000-0839051fff 912m ----- SmFixed write(2,"--23675:0: aspacem 9: RSVN 080"...,73) = 73 (0x49) getpid() = 23675 (0x5c7b) --23675:0: aspacem 10: ANON 0839052000-0859031fff 511m ----- write(2,"--23675:0: aspacem 10: ANON 083"...,65) = 65 (0x41) getpid() = 23675 (0x5c7b) --23675:0: aspacem 11: ANON 0859032000-0859051fff 131072 rw--- write(2,"--23675:0: aspacem 11: ANON 085"...,65) = 65 (0x41) getpid() = 23675 (0x5c7b) --23675:0: aspacem 12: RSVN 0859052000-7fffffffefff 131038g ----- SmFixed write(2,"--23675:0: aspacem 12: RSVN 085"...,75) = 75 (0x4b) getpid() = 23675 (0x5c7b) --23675:0: aspacem 13: ANON 7ffffffff000-7fffffffffff 4096 r-x-- write(2,"--23675:0: aspacem 13: ANON 7ff"...,69) = 69 (0x45) getpid() = 23675 (0x5c7b) --23675:0: aspacem 14: RSVN 800000000000-ffffffffffffffff 16383e ----- SmFixed write(2,"--23675:0: aspacem 14: RSVN 800"...,81) = 81 (0x51) getpid() = 23675 (0x5c7b) --23675:0: aspacem >>> write(2,"--23675:0: aspacem >>>\n",23) = 23 (0x17) getpid() = 23675 (0x5c7b) --23675-- core : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB write(2,"--23675-- core : "...,208) = 208 (0xd0) getpid() = 23675 (0x5c7b) --23675-- dinfo : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB write(2,"--23675-- dinfo : "...,208) = 208 (0xd0) getpid() = 23675 (0x5c7b) --23675-- (null) : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 0 rzB write(2,"--23675-- (null) : "...,208) = 208 (0xd0) getpid() = 23675 (0x5c7b) --23675-- demangle: 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB write(2,"--23675-- demangle: "...,208) = 208 (0xd0) getpid() = 23675 (0x5c7b) --23675-- ttaux : 0/ 0 max/curr mmap'd, 0/0 unsplit/split sb unmmap'd, 0/ 0 max/curr, 0/ 0 totalloc-blocks/bytes, 0 searches 8 rzB write(2,"--23675-- ttaux : "...,208) = 208 (0xd0) getpid() = 23675 (0x5c7b) --23675-- translate: 0 guest insns, 0 traces, 0 uncond chased, 0 cond chased write(2,"--23675-- translate: 0 guest ins"...,77) = 77 (0x4d) getpid() = 23675 (0x5c7b) --23675-- translate: no SP updates identified write(2,"--23675-- translate: no SP updat"...,46) = 46 (0x2e) getpid() = 23675 (0x5c7b) --23675-- translate: PX: SPonly 0, UnwRegs 0, AllRegs 0, AllRegsAllInsns 0 write(2,"--23675-- translate: PX: SPonly "...,78) = 78 (0x4e) getpid() = 23675 (0x5c7b) --23675-- tt/tc: 0 tt lookups requiring 0 probes write(2,"--23675-- tt/tc: 0 tt lookup"...,53) = 53 (0x35) getpid() = 23675 (0x5c7b) --23675-- tt/tc: 0 fast-cache updates, 0 flushes write(2,"--23675-- tt/tc: 0 fast-cach"...,53) = 53 (0x35) getpid() = 23675 (0x5c7b) --23675-- transtab: new 0 (0 -> 0; ratio 0.0) [0 scs] avg tce size 0 write(2,"--23675-- transtab: new "...,77) = 77 (0x4d) getpid() = 23675 (0x5c7b) --23675-- transtab: dumped 0 (0 -> ??) (sectors recycled 0) write(2,"--23675-- transtab: dumped "...,65) = 65 (0x41) getpid() = 23675 (0x5c7b) --23675-- transtab: discarded 0 (0 -> ??) write(2,"--23675-- transtab: discarded "...,44) = 44 (0x2c) getpid() = 23675 (0x5c7b) --23675-- scheduler: 0 event checks. write(2,"--23675-- scheduler: 0 event che"...,37) = 37 (0x25) getpid() = 23675 (0x5c7b) --23675-- scheduler: 0 indir transfers, 0 misses (1 in 0) .. write(2,"--23675-- scheduler: 0 indir tra"...,61) = 61 (0x3d) getpid() = 23675 (0x5c7b) --23675-- scheduler: .. of which: 0 hit0, 0 hit1, 0 hit2, 0 hit3, 0 missed write(2,"--23675-- scheduler: .. of which"...,75) = 75 (0x4b) getpid() = 23675 (0x5c7b) --23675-- scheduler: 0/0 major/minor sched events. write(2,"--23675-- scheduler: 0/0 major/m"...,51) = 51 (0x33) getpid() = 23675 (0x5c7b) --23675-- sanity: 0 cheap, 0 expensive checks. write(2,"--23675-- sanity: 0 cheap, 0 "...,50) = 50 (0x32) mmap(0x402001000,4194304,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) ERR#13 'Permission denied' getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) ==23675== ==23675== Valgrind's memory management: out of memory: ==23675== newSuperblock's request for 4194304 bytes failed. ==23675== 576,544,768 bytes have already been mmap-ed ANONYMOUS. ==23675== Valgrind cannot continue. Sorry. ==23675== ==23675== There are several possible reasons for this. ==23675== - You have some kind of memory limit in place. Look at the ==23675== output of 'ulimit -a'. Is there a limit on the size of ==23675== virtual memory or addwrite(2,"==23675== \n==23675== Valgri"...,512) = 512 (0x200) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) ress space? ==23675== - You have run out of swap space. ==23675== - Valgrind has a bug. If you think this is the case or you are ==23675== not sure, please let us know and we'll try to fix it. ==23675== Please note that programs can take substantially more memory than ==23675== normal when running under Valgrind tools, eg. up to twice or ==23675== more, depending on the tool. On a 64-bit machine, Valgrind ==23675== should be able to make use of up 32GB memory. On a 32-bit ==23675== write(2,"ress space?\n==23675== - You"...,519) = 519 (0x207) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) getpid() = 23675 (0x5c7b) machine, Valgrind should be able to use all the memory available ==23675== to a single process, up to 4GB if that's how you have your ==23675== kernel configured. Most 32-bit Linux setups allow a maximum of ==23675== 3GB per process. ==23675== ==23675== Whatever the reason, Valgrind cannot continue. Sorry. write(2," machine, Valgrind should be a"...,330) = 330 (0x14a) exit(0x1) process exit, rval = 1 -- You are receiving this mail because: You are watching all bug changes.