summary refs log tree commit diff stats
path: root/results/classifier/zero-shot-user-mode/output/instruction/1878501
blob: 3675688f5ab553b90c966d6cb39e04b1ba3b51d5 (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
instruction: 0.405
runtime: 0.320
syscall: 0.275



qemu-i386 does not define AT_SYSINFO

qemu-i386 does not define the AT_SYSINFO auxval when running i386 Linux binaries.

On most libcs, this is properly handled, but this is mandatory for the i686 Bionic (Android) libc or it will segfault.

This is due to a blind assumption that getauxval(AT_SYSINFO) will return a valid function pointer:

The code varies from version to version, but it looks like this:

void *__libc_sysinfo;
// mangled as _Z19__libc_init_sysinfov
void __libc_init_sysinfo() {
  bool dummy;
  // __bionic_getauxval = getauxval
  __libc_sysinfo = reinterpret_cast<void *>(__bionic_getauxval(AT_SYSINFO, dummy));
}

A simple way to reproduce is to compile a basic C program against the NDK:

int main(void) { return 0; }

$ i686-linux-android-clang -static empty.c -o empty
$ qemu-i386 -cpu max ./empty
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault

The place where it segfaults is misleading: It will, at least on the current NDK, crash on __set_thread_area, this is due to it calling a function pointer to __libc_sysinfo returned by __kernel_syscall.

QEMU 4.1.1 (aarch64)
Pixel 2 XL via Termux