https://bugs.kde.org/show_bug.cgi?id=359249
Bug ID: 359249 Summary: valgrind unable to load 64-bit linux executable linked with -mcmodel=medium Product: valgrind Version: 3.11.0 Platform: RedHat RPMs OS: other Status: UNCONFIRMED Severity: normal Priority: NOR Component: general Assignee: jsew...@acm.org Reporter: dbe...@bloomberg.net Valgrind seems to be unable to load a 64-bit executable with a large data section built with gcc on linux if the '-mcmodel=medium' option is specified. All symbols in messages from valgrind show as '???' and running 'valgrind -v' shows the error "ELF section outside all mapped regions". Removing the 'mcmodel' option fixes the issue, but is not always possible as it may be needed in some configurations. The issue seems to happen if there is a read-only LOAD section in the ELF program headers. I am building using gcc 4.8.2 on RHEL 6.4 and testing using valgrind 3.11.0. Reproducible: Always Steps to Reproduce: $ cat >test.cpp <<END #include <stdlib.h> int main(int argc, char **argv) { static const char data[1024 * 1024] = {0}; malloc(1024); return 0; } END $ gcc -m64 -mcmodel=medium test.cpp -o test $ valgrind --leak-check=full ./test $ ../temp/opt/bb/lib64/bin/valgrind --leak-check=full ./test ==27562== Memcheck, a memory error detector ==27562== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==27562== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==27562== Command: ./test ... ==27562== HEAP SUMMARY: ==27562== in use at exit: 1,024 bytes in 1 blocks ==27562== total heap usage: 1 allocs, 0 frees, 1,024 bytes allocated ==27562== ==27562== 1,024 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==27562== at 0x4A05BED: malloc (vg_replace_malloc.c:299) ==27562== by 0x400588: ??? (in ./test) ==27562== by 0x3EA821ED5C: (below main) (in /lib64/libc-2.12.so) ==27562== ==27562== LEAK SUMMARY: ==27562== definitely lost: 1,024 bytes in 1 blocks ==27562== indirectly lost: 0 bytes in 0 blocks ==27562== possibly lost: 0 bytes in 0 blocks ==27562== still reachable: 0 bytes in 0 blocks ==27562== suppressed: 0 bytes in 0 blocks ==27562== ==27562== For counts of detected and suppressed errors, rerun with: -v ==27562== Use --track-origins=yes to see where uninitialised values come from ==27562== ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0) $ valgrind --leak-check=full -v ./test ==29881== Memcheck, a memory error detector ==29881== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==29881== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==29881== Command: ./test ==29881== --29881-- Valgrind options: --29881-- --leak-check=full --29881-- -v --29881-- Contents of /proc/version: --29881-- Linux version 2.6.32-358.41.1.el6.x86_64 (mockbu...@x86-029.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Mon Apr 21 15:58:42 EDT 2014 --29881-- --29881-- Arch and hwcaps: AMD64, LittleEndian, amd64-cx16-rdtscp-sse3-avx --29881-- Page sizes: currently 4096, max supported 4096 --29881-- Valgrind library directory: /usr/lib64/valgrind --29881-- Reading syms from ./test --29881-- ELF section outside all mapped regions Actual Results: valgrind shows ??? instead of 'main' in the call stack, and shows the error "ELF section outside all mapped regions" while reading my executable Expected Results: Should show 'main' in the call stack. === gcc version info === $ gcc -v Using built-in specs. COLLECT_GCC=/opt/rh/devtoolset-2/root/usr/bin/gcc COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-2/root/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/opt/rh/devtoolset-2/root/usr --mandir=/opt/rh/devtoolset-2/root/usr/share/man --infodir=/opt/rh/devtoolset-2/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,fortran,lto --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/cloog-install --with-mpc=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/mpc-install --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux Thread model: posix gcc version 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC) === readelf dump of program headers === $ readelf -l test Elf file type is EXEC (Executable file) Entry point 0x400410 There are 9 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040 0x00000000000001f8 0x00000000000001f8 R E 8 INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238 0x000000000000001c 0x000000000000001c R 1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000 0x00000000000006cc 0x00000000000006cc R E 200000 LOAD 0x00000000000006d0 0x00000000006006d0 0x00000000006006d0 0x000000000000021c 0x0000000000000220 RW 200000 LOAD 0x00000000000008f0 0x00000000008008f0 0x00000000008008f0 0x0000000000100010 0x0000000000100010 R 200000 DYNAMIC 0x00000000000006e8 0x00000000006006e8 0x00000000006006e8 0x00000000000001d0 0x00000000000001d0 RW 8 NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254 0x0000000000000044 0x0000000000000044 R 4 GNU_EH_FRAME 0x00000000000005f8 0x00000000004005f8 0x00000000004005f8 0x000000000000002c 0x000000000000002c R 4 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 10 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 04 .lrodata 05 .dynamic 06 .note.ABI-tag .note.gnu.build-id 07 .eh_frame_hdr 08 === valgrind trace of program header loading === $ valgrind --trace-symtab=yes ./test ==52969== Memcheck, a memory error detector ==52969== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==52969== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==52969== Command: ./test ==52969== ------ start ELF OBJECT ------------------------------------------------------- ------ name = ./test Un-de-overlapped _DebugInfoMappings: [0] avma 0x400000 size 4096 foff 0 rx -- -- [1] avma 0x600000 size 4096 foff 0 -- rw -- De-overlapped DebugInfoMappings: [0] avma 0x400000 size 4096 foff 0 rx -- -- [1] avma 0x600000 size 4096 foff 0 -- rw -- Checking that there are no remaining overlaps. Check successful. ------ Basic facts about the object ------ object: n_oimage 1055514 phdr: ioff 64 nent 9 ent_szB 56 shdr: ioff 1051248 nent 31 ent_szB 64 rx_map: avma 0x400000 size 4096 foff 0 rw_map: avma 0x600000 size 4096 foff 0 shdr: string table at 1050969 ------ Examining the program headers ------ PT_LOAD[2]: p_vaddr 0x400000 (prev 0x0) PT_LOAD[2]: p_offset 0, p_filesz 1740, perms r-x PT_LOAD[2]: acquired as rx, bias 0x0 PT_LOAD[3]: p_vaddr 0x6006d0 (prev 0x400000) PT_LOAD[3]: p_offset 1744, p_filesz 540, perms rw- PT_LOAD[3]: acquired as rw, bias 0x0 PT_LOAD[4]: p_vaddr 0x8008f0 (prev 0x6006d0) PT_LOAD[4]: p_offset 2288, p_filesz 1048592, perms r-- ------ ELF reading failed ------ ------ name = ./test ------ end ELF OBJECT ------------------------------------------------------- -- You are receiving this mail because: You are watching all bug changes.