Package: valgrind
Version: 1:3.10.0-4
Severity: important
Tags: patch
Hi,
So after encountering #777669, I moved to another machine which uses 16K
pages. This time it got another error:
> $ valgrind -d /bin/true
> --461:1:debuglog DebugLog system started by Stage 1, level 1 logging requested
> --461:1:launcher no tool requested, defaulting to 'memcheck'
> --461:1:launcher selected platform 'mips32-linux'
> --461:1:launcher launching /usr/lib/valgrind/memcheck-mips32-linux
> --461:1:debuglog DebugLog system started by Stage 2 (main), level 1 logging
> requested
> --461:1:main Welcome to Valgrind version 3.10.0 debug logging
> --461:1:main Checking current stack is plausible
> --461:1:main Checking initial stack was noted
> --461:1:main Starting the address space manager
> --461:1:main Address space manager is running
> --461:1:main Starting the dynamic memory manager
> --461:1:mallocfr newSuperblock at 0x41C0C000 (pszB 4194288) owner
> VALGRIND/core
> --461:1:mallocfr deferred_reclaimSuperblock at 0x41C0C000 (pszB 4194288)
> (prev 0x0) owner VALGRIND/core
> --461:1:main Dynamic memory manager is running
> --461:1:main Initialise m_debuginfo
> --461:1:main VG_(libdir) = /usr/lib/valgrind
> --461:1:main Getting launcher's name ...
> --461:1:main ... /usr/bin/valgrind.bin
> --461:1:main Get hardware capabilities ...
> --461:1:mallocfr deferred_reclaimSuperblock at 0x41C0C000 (pszB 4194288)
> (prev 0x41C0C000) owner VALGRIND/core
> --461:1:machine hwcaps = 0x10040
> --461:1:cache Could not autodetect cache info
> --461:1:main ... arch = MIPS32, hwcaps = MIPS-baseline
> --461:1:main Getting the working directory at startup
> --461:1:main ... /home/jcowgill
> --461:1:main Split up command line
> --461:1:main (early_) Process Valgrind's command line options
> --461:1:main Create initial image
> --461:1:initimg Loading client
> valgrind: mmap(0x400000, 32768) failed in UME with error 22 (Invalid
> argument).
> valgrind: this can be caused by executables with very large text, data or bss
> segments.
I tracked this down to the new(ish) .MIPS.abiflags section still being
loaded at the normal 0x00400000 address instead of the higher 0x38000000
address.
> $ readelf -l /usr/lib/valgrind/memcheck-mips32-linux
>
> Elf file type is EXEC (Executable file)
> Entry point 0x38118950
> There are 8 program headers, starting at offset 52
>
> Program Headers:
> Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
> ABIFLAGS 0x000138 0x00400138 0x00400138 0x00018 0x00018 R 0x8
> REGINFO 0x010000 0x38000000 0x38000000 0x00018 0x00018 R 0x4
> LOAD 0x000000 0x00400000 0x00400000 0x00150 0x00150 R 0x10000
> LOAD 0x010000 0x38000000 0x38000000 0x4b15e0 0x4b15e0 R E 0x10000
> LOAD 0x4c1f8c 0x384c1f8c 0x384c1f8c 0x0d9b4 0x115e320 RW 0x10000
> NOTE 0x010018 0x38000018 0x38000018 0x00024 0x00024 R 0x4
> GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10
> GNU_RELRO 0x4c1f8c 0x384c1f8c 0x384c1f8c 0x02074 0x02074 R 0x1
>
> Section to Segment mapping:
> Segment Sections...
> 00 .MIPS.abiflags
> 01 .reginfo
> 02 .MIPS.abiflags
> 03 .reginfo .note.gnu.build-id .text .rodata .eh_frame
> 04 .data.rel.ro .data .got .sbss .bss
> 05 .note.gnu.build-id
> 06
> 07 .data.rel.ro
I've attached a patch which fixes this by disabling the mips linker
workarounds when using -Ttext-section which handles all of this.
After this valgrind works on mips!
Thanks,
James
--- a/coregrind/link_tool_exe_linux.in
+++ b/coregrind/link_tool_exe_linux.in
@@ -76,12 +76,13 @@ my $x = `cat ../config.log 2>&1 | grep h
my $arch = substr($x, 0, index($x, "'"));
my $extra_args;
-if (($arch eq 'mips') || ($arch eq 'mipsel')
- || ($arch eq 'mipsisa32r2el')) {
- $extra_args = "-static -Wl,--section-start=.reginfo=$ala";
-} elsif (($arch eq 'mips64') || ($arch eq 'mips64el') ||
- ($arch eq 'mipsisa64el')) {
- $extra_args = "-static -Wl,--section-start=.MIPS.options=$ala";
+if ($arch =~ /^mips/ && "@FLAG_T_TEXT@" eq '-Ttext') {
+ # We only need to use the special mips options when using -Ttext
+ if ($arch =~ /^mips(64|isa64)/) {
+ $extra_args = "-static -Wl,--section-start=.MIPS.options=$ala";
+ } else {
+ $extra_args = "-static -Wl,--section-start=.reginfo=$ala";
+ }
} else {
$extra_args = "-static -Wl,@FLAG_T_TEXT@=$ala";
}