指定GCC输出二进制文件的预期Linux版本

时间:2019-04-02 10:03:43

标签: linux gcc version

我正在帮助其他人进行“操作系统概念”课程的实验室实验。实验任务是编译 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上运行的东西。借助Ubuntu APT存储库中的GCC 4.8(可信任),如何使GCC输出在Linux 2.6.26上运行的内容?

FYI:在我自己的测试VM上(也是Ubuntu 14.04.6,Linux 4.4,与Ubuntu APT repo相同的最新GCC版本,截至2019年4月2日),编译后的程序显示 Linux 2.6.24 file输出中。而且, his 二进制文件在我的新编译的2.6.32.37内核中,在QEMU中运行得很好。

2 个答案:

答案 0 :(得分:1)

  

指定GCC输出二进制文件的预期Linux版本

在您的问题中,您谈到的是libc C的版本,但它也可能涉及许多其他lib,也许您还希望生成32b和/或64b可执行文件。

对我来说,最安全的方法是使用 pbuilder ,我用它为Ubuntu Cosmic(18.10)Bionic(18.04)生成BoUML debs , 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版本中完成的,因此您可以确定结果。

答案 1 :(得分:0)

提供的实验室环境是Ubuntu 14.04,其中软件包 libc6 具有版本2.19-0ubuntu6.14

助手教授提供的实验指令包含一条指令,该指令用于通过手动编辑/etc/apt/sources.list来更改APT源,其中存在严重错误:编辑后的示例是 xenial 而不是 trusty ,如果遵循该示例,它会实际上将您的系统更新为Xenial(Ubuntu 16.04)。 libc6 的新版本为2.23-0ubuntu11,这将导致asld(来自binutils,与GCC不相关)从最低Linux版本输出ELF。 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),并编译了程序并再次对其进行了检查。