Pārlūkot izejas kodu

Add GetBase support for ASLR kernel mappings (#371)

Add GetBase support for kernel mappings as reported by Linux Perf

Linux Perf reports kernel mappings with an offset == start.
Currently GetBase() cannot handle such a case.

This behavior can be seen from a perf.report data with samples in the kernel:

$ sudo perf report -D perf.data | grep MMAP
0 0x108 [0x50]: PERF_RECORD_MMAP -1/0: [0xffffffffaf800000(0x1087a000) @ 0xffffffffaf800000]: x [kernel.kallsyms]_text
Raul Silvera 7 gadus atpakaļ
vecāks
revīzija
520140b6bf
2 mainītis faili ar 5 papildinājumiem un 3 dzēšanām
  1. 2
    2
      internal/elfexec/elfexec.go
  2. 3
    1
      internal/elfexec/elfexec_test.go

+ 2
- 2
internal/elfexec/elfexec.go Parādīt failu

@@ -208,13 +208,13 @@ func GetBase(fh *elf.FileHeader, loadSegment *elf.ProgHeader, stextOffset *uint6
208 208
 		if loadSegment.Vaddr == start-offset {
209 209
 			return offset, nil
210 210
 		}
211
-		if start >= loadSegment.Vaddr && limit > start && (offset == 0 || offset == pageOffsetPpc64) {
211
+		if start >= loadSegment.Vaddr && limit > start && (offset == 0 || offset == pageOffsetPpc64 || offset == start) {
212 212
 			// Some kernels look like:
213 213
 			//       VADDR=0xffffffff80200000
214 214
 			// stextOffset=0xffffffff80200198
215 215
 			//       Start=0xffffffff83200000
216 216
 			//       Limit=0xffffffff84200000
217
-			//      Offset=0 (0xc000000000000000 for PowerPC64)
217
+			//      Offset=0 (0xc000000000000000 for PowerPC64) (== Start for ASLR kernel)
218 218
 			// So the base should be:
219 219
 			if stextOffset != nil && (start%pageSize) == (*stextOffset%pageSize) {
220 220
 				// perf uses the address of _stext as start. Some tools may

+ 3
- 1
internal/elfexec/elfexec_test.go Parādīt failu

@@ -55,7 +55,9 @@ func TestGetBase(t *testing.T) {
55 55
 		{"exec offset 2", fhExec, lsOffset, nil, 0x200000, 0x600000, 0, 0, false},
56 56
 		{"exec nomap", fhExec, nil, nil, 0, 0, 0, 0, false},
57 57
 		{"exec kernel", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0xffffffff82000198, 0xffffffff83000198, 0, 0x1000000, false},
58
-		{"exec PPC64 kernel", fhExec, ppc64KernelHeader, uint64p(0xc000000000000000), 0xc000000000000000, 0xd00000001a730000, 0xc000000000000000, 0x0, false},
58
+		{"exec kernel", fhExec, kernelHeader, uint64p(0xffffffff810002b8), 0xffffffff81000000, 0xffffffffa0000000, 0x0, 0x0, false},
59
+		{"exec kernel ASLR", fhExec, kernelHeader, uint64p(0xffffffff810002b8), 0xffffffff81000000, 0xffffffffa0000000, 0xffffffff81000000, 0x0, false},
60
+		{"exec PPC64 kernel", fhExec, ppc64KernelHeader, uint64p(0xc000000000000000), 0xc000000000000000, 0xd00000001a730000, 0x0, 0x0, false},
59 61
 		{"exec chromeos kernel", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0, 0x10197, 0, 0x7efffe68, false},
60 62
 		{"exec chromeos kernel 2", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0, 0x10198, 0, 0x7efffe68, false},
61 63
 		{"exec chromeos kernel 3", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0x198, 0x100000, 0, 0x7f000000, false},