Почему какой-то вывод из system () отсутствует при отладке программы с помощью qemu и chroot - PullRequest
0 голосов
/ 19 июня 2020

Недавно я попытался отладить кросс-скомпилированную программу arm с помощью QEMU, но у меня возникла проблема.

Это очень простой код.

int main()  
{  
    printf("aaa\n");
    int  status;  
    status = system("./bin/ls"); 
    printf("Result of [system] = 0x%x\n", status);
}

Когда я запустите программу с помощью команды

spy@spy-virtual-machine:/usr/arm-linux-gnueabihf$ ./qemu-arm-static -L ./ ./a.out 

Результат будет:

aaa
bin              include          lib              test.c           qemu-arm-static  a.out            qemu-arm         shell.sh
Result of [system] = 0x0

Но когда я запускаю программу с ch root вот так:

spy@spy-virtual-machine:/usr/arm-linux-gnueabihf$ sudo chroot ./ ./qemu-arm-static -L ./ ./a.out

На выходе получается:

aaa
Result of [system] = 0x7f00

Очевидно, system("./bin/ls") не запускается должным образом.

Но команду ./bin/ls можно запустить с помощью ch root & QEMU:

spy@spy-virtual-machine:/usr/arm-linux-gnueabihf$ sudo chroot ./ ./qemu-arm-static -L ./ ./bin/ls
bin              include          lib              test.c           qemu-arm-static  a.out            qemu-arm         shell.sh

Теперь я полностью запутался. Может ли кто-нибудь дать мне подсказку по этому поводу, и что я могу сделать, чтобы получить правильный вывод функции system при использовании команды chroot.

Весь ввод и вывод командной строки можно найти на этом рисунке: Содержание командной строки

1 Ответ

0 голосов
/ 19 июня 2020

From man 3 system :

system () выполняет команду, указанную в command, путем вызова / bin / sh - c command

Итак, вам нужна рабочая оболочка внутри ch root, чтобы иметь возможность успешно вызывать system ().

Когда эта программа работает в qemu-arm-stati c, происходит следующее. : system() приводит к fork(), за которым следует exec() для оболочки. Когда вы запускаете его без ch root, это оболочка вашего хоста (x86). Затем оболочка вызывает fork(), а затем exec() для bin/ls (ARM). Насколько я понимаю, это может быть успешным только в том случае, если у вас есть обработчик binfmt для ARM ELF, зарегистрированный на вашем хосте. В этом случае загружается зарегистрированная qemu-arm, и она выполняет bin/ls.

Когда вы делаете то же самое в ch root, оболочка хоста недоступна, поэтому system() приводит к exec() позвоните по номеру bin/sh (ARM). Похоже, ваш обработчик binfmt недоступен внутри ch root, и из-за этого загрузка bin/sh не выполняется, а статус ошибки возвращается из system().

Вы можете проверить зарегистрированные обработчики binfmt в / proc / sys / fs / binfmt_mis c

...