summary refs log tree commit diff stats
path: root/results/classifier/zero-shot/118/none/1346769
blob: cd9b2b6e57bf7cd6b05682e554f1209a34ca13b3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
peripherals: 0.688
PID: 0.635
graphic: 0.614
user-level: 0.599
network: 0.588
permissions: 0.575
virtual: 0.572
ppc: 0.571
debug: 0.566
semantic: 0.561
arm: 0.560
register: 0.552
device: 0.546
TCG: 0.544
hypervisor: 0.541
VMM: 0.540
risc-v: 0.540
performance: 0.532
architecture: 0.503
i386: 0.497
boot: 0.494
mistranslation: 0.485
x86: 0.462
vnc: 0.460
socket: 0.441
files: 0.424
kernel: 0.424
assembly: 0.384
KVM: 0.332

/proc/self/maps content returned to 32-bits guest under 64-bits qemu

Reading /proc/self/maps a user doesn't get a stack record. Not all programs relies on the maps file but some do.

The bug found by running 32-bits binaries with address sanitizer (Asan) instrumentations under 64-bit qemu.

$ echo "int main() { return 0; }" > /tmp/test.c
$ gcc -m32 -fsanitize=address -fno-common -Wall -g -fPIC -o /tmp/test /tmp/test.c
$ qemu-i386-static /tmp/test
==4092==AddressSanitizer CHECK failed: /home/michail/Downloads/gcc-4.9.0/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cc:63 "(((uptr)&rl >= start && (uptr)&rl < end)) != (0)" (0x0, 0x0)
    #0 0xf632ff01 (/home/michail/build/lib32/libasan.so.1+0x53f01)
    #1 0xf6333f49 (/home/michail/build/lib32/libasan.so.1+0x57f49)
    #2 0xf6338785 (/home/michail/build/lib32/libasan.so.1+0x5c785)
    #3 0xf6338bd1 (/home/michail/build/lib32/libasan.so.1+0x5cbd1)
    #4 0xf6331baf (/home/michail/build/lib32/libasan.so.1+0x55baf)
    #5 0xf6331dca (/home/michail/build/lib32/libasan.so.1+0x55dca)
    #6 0xf6331f5a (/home/michail/build/lib32/libasan.so.1+0x55f5a)
    #7 0xf6330bd4 (/home/michail/build/lib32/libasan.so.1+0x54bd4)
    #8 0xf67ebeec (/lib/ld-linux.so.2+0xeeec)
    #9 0xf67de10e (/lib/ld-linux.so.2+0x110e)

This happened because during initialization Asan can't find stack boundaries.

For some reasons Qemu wants to report stack boundaries just for several arch targets skipping other ones. This is from linux-user/syscall.c open_self_maps()

#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
    dprintf(fd, "%08llx-%08llx rw-p %08llx 00:00 0          [stack]\n",
                (unsigned long long)ts->info->stack_limit,
                (unsigned long long)(ts->info->start_stack +
                                     (TARGET_PAGE_SIZE - 1)) & TARGET_PAGE_MASK,
                (unsigned long long)0);
#endif

Not very clear why the case covers just specific targets.

This bug continues the previously reported issue with not hiden system map http://lists.nongnu.org/archive/html/qemu-devel/2014-07/msg02793.html.

I think the ifdefs are just accident of history and we can safely remove them.

We removed the ifdefs at some point; the test case in this bug report now runs successfully.