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

指定GCC输出二进制文件的预期Linux版本,linux,gcc,version,Linux,Gcc,Version,我正在帮助其他人做“操作系统概念”课程的实验室实验。实验任务是编译Linux2.6.26,并在QEMU中运行 编译Linux内核后,我们被告知编写一个最小的程序作为init程序。我们介绍(并遵循)的示例是: #包括 int main(){ 而(1){ 放(“你好!”); 睡眠(2); } } 编译命令是: root@ubuntu:/home/vmware/oslab#gcc--版本 gcc(Ubuntu 4.8.4-2ubuntu1~14.04.4)4.8.4 版权所有(C)2013免费软件基

我正在帮助其他人做“操作系统概念”课程的实验室实验。实验任务是编译Linux2.6.26,并在QEMU中运行

编译Linux内核后,我们被告知编写一个最小的程序作为
init
程序。我们介绍(并遵循)的示例是:

#包括
int main(){
而(1){
放(“你好!”);
睡眠(2);
}
}
编译命令是:

root@ubuntu:/home/vmware/oslab#gcc--版本
gcc(Ubuntu 4.8.4-2ubuntu1~14.04.4)4.8.4
版权所有(C)2013免费软件基金会。
这是自由软件;有关复制条件,请参见源。没有
担保甚至不是为了适销性或适合某一特定目的。
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
对我来说,这显然不能在Linux2.6.26上运行。有了Ubuntu APT存储库(trusty)中提供的GCC4.8,我如何让GCC输出在Linux 2.6.26上运行的东西

仅供参考:在我自己的测试VM上(也是Ubuntu 14.04.6,Linux 4.4,与2019年4月2日Ubuntu APT repo的最新GCC版本相同),编译的程序在
文件
输出中显示Linux 2.6.24。另外,他的二进制代码在QEMU中运行得非常好,我的新编译的2.6.32.37内核

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

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

对我来说,最安全的方法是使用pbuilder,我用它为ubuntucosmic(18.10)Bionic(18.04)、Artful(17.10)Zesty(17.04)、Yakkety(16.10)Xenial(16.04)、Trusty(14.04)和precision(12.04)以及32b和64b生成debs,我从ubuntuxenial 64b生成所有这些,只需执行pbuilder命令的适当序列(每个Linux版本都不需要重新启动)


这需要时间来生成版本,但因为这是在相应的Linux版本中生成的,所以您可以确定结果。

提供的实验室环境是Ubuntu 14.04,其中libc6的版本为
2.19-0ubuntu6.14

助教提供的实验说明中包含一条通过手动编辑
/etc/APT/sources.list
来更改APT源代码的说明,这其中有一个严重的灾难:“版本”编辑的示例中的字符串是xenial,而不是trusty,如果遵循该字符串,将实际将您的系统更新为xenial(Ubuntu 16.04)。libc6的新版本是
2.23-0ubuntu11
,这将导致
as
ld
(来自binutils,与GCC无关)以最低Linux版本2.6.32输出ELF

对于glibc版本2.19,输出ELF与Linux 2.6.24兼容,但对于glibc 2.23,输出仅与Linux 2.6.32兼容


我通过在Ubuntu14.04下编译一个测试程序并检查ELF信息来测试和验证这一点,然后将所有的
trusty
替换为
xenial
apt得到了更新
,并且只更新了
binutils
及其依赖项(包括libc6),编译程序并再次检查。

这是glibc的东西,而不是gcc的东西:@Shawn二进制文件静态链接时glibc有什么关系?它静态链接到glibc的特定版本,而glibc又被配置为需要特定的最低内核版本。@Shawn为什么是glibc而不是binutils(
as
ld
等)?