Укажите ожидаемую версию Linux для выходного двоичного файла GCC - PullRequest
0 голосов
/ 02 апреля 2019

Я помогаю другим в проведении лабораторного эксперимента по курсу «Концепции операционных систем».Задача эксперимента состоит в том, чтобы скомпилировать 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.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Укажите ожидаемую версию Linux для выходного двоичного файла GCC

в своем вопросе вы говорите о версии libc C, но это также может касаться многих других библиотек, и, возможно, вы захотите также создать исполняемые файлы 32b и / или 64b.

Для меня наиболее безопасный способ - использовать pbuilder , я использую его для производства BoUML Деб для Ubuntu Cosmic (18.10) Bionic (18.04), Artful (17.10) Zesty (17.04) Yakkety (16.10) Xenial (16.04) Trusty (14.04) и Precise (12.04) и то, и другое в 32b и 64b, и я делаю все это из моего Ubuntu Xenial 64b, просто выполняя соответствующую последовательность pbuilder команды (без перезагрузки в каждом выпуске Linux)

Для создания версии требуется время, но поскольку это сделано в соответствующей версии Linux, вы уверены в результате.

0 голосов
/ 06 апреля 2019

Предоставленная лабораторная среда была Ubuntu 14.04, где пакет libc6 имеет версию 2.19-0ubuntu6.14.

Лабораторная инструкция, предоставленная обучающими помощниками , содержала инструкцию изменить источник APT, отредактировав /etc/apt/sources.list вручную, что привело к СЕРЬЕЗНОЙ катастрофе: строка «version» в отредактированном примере была xenial вместо trusty , что, если следовать, фактически обновит вашу систему до Xenial (Ubuntu 16.04). Новая версия libc6 была 2.23-0ubuntu11, что привело бы к as и ld (из binutils, не связанных с GCC) для вывода ELF с минимальной версией Linux 2.6.32.

В glibc версии 2.19 выходной ELF совместим с Linux 2.6.24, но с glibc 2.23 выход совместим только с Linux 2.6.32.

Я проверил и проверил это, скомпилировав тестовую программу под Ubuntu 14.04 и проверив информацию ELF, затем заменил все trusty на xenial, сделал apt-get update и только обновил binutils и его зависимости (включая libc6), и скомпилировал программу и проверил ее снова.

...