Я помогаю другим в проведении лабораторного эксперимента по курсу «Концепции операционных систем».Задача эксперимента состоит в том, чтобы скомпилировать Linux 2.6.26 и запустить его в QEMU.
После компиляции ядра Linux, нам сказали написать самую маленькую программу, которая будет выполнять функцию init
программа.Пример, который мы представили (и мы следовали):
#include <stdio.h>
int main() {
while (1) {
puts("Hello!");
sleep(2);
}
}
Команда компиляции:
root@ubuntu:/home/vmware/oslab# gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
root@ubuntu:/home/vmware/oslab# gcc -static -o init hello.c
Средой хоста должна быть недавно установленная Ubuntu 14.04.6 (i386).
Проблема в том, что один из моих сокурсников внимательно следовал инструкции, и программа init не была выполнена.Я спросил у него всю его initrd.img
и заметил, как его init
программа выглядит иначе:
vmware@ubuntu:~/oslab$ file mnt/init
mnt/init: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=7365ac494ef1d924c171899c169dbd3195d2d209, not stripped
Для меня это явно не то, что может работать в Linux 2.6.26.С GCC 4.8, предоставленным в репозитории Ubuntu APT (верный), как я могу заставить GCC выводить что-то, что работает в Linux 2.6.26?
FYI: На моей собственной тестирующей виртуальной машине (также Ubuntu 14.04.6, Linux)4.4, та же самая последняя версия GCC из репозитория Ubuntu APT от 2 апреля 2019 г.), скомпилированная программа показывает Linux 2.6.24 в file
выводе.Кроме того, его двоичный файл прекрасно работает в QEMU с моим недавно скомпилированным ядром 2.6.32.37.