LWN:删除 a.out 支持!

共 2547字,需浏览 6分钟

 ·

2022-04-09 16:27

关注了就能看到更多这么棒的文章哦~

A way out for a.out

By Jonathan Corbet
March 24, 2022
DeepL assisted translation
https://lwn.net/Articles/888741/

a.out 这种可执行文件格式(executable format)可以追溯到 Linux 最早期的时候,甚至比那还要早。几十年来,都没有采用认真的方式来使用它,但是 Linux 内核中仍然存在对它的支持,并且拒绝了所有申请将它删除的提议。早在一月份的时候,Borislav Petkov 再次试图删除对这种格式的支持,引出了另一次长时间的讨论。不过,这次有一个不同之处:摆脱 a.out 支持的目标可能会达成。

a.out 格式可以追溯到 Unix 的第一版。当 MINIX 出现时,它自然而然地将这种格式用于此系统中的可执行文件,这进而导致 a.out 也被用于 Linux。这是一种简单的格式,它在 Linux 上的实现甚至更简单。每一个 Linux 共享库都必须被集中分配自己的地址空间,因为库函数在运行时不能被改变位置。尽管如此,Linux 还是使用了.out 挺长一段时间,直到 1993 年 0.99.13 版本的开发内核中首次加入了对新兴的 ELF 格式的支持。

有一段时间,我们中一些比较疯狂的人手动将 Slackware 系统从 a.out 转换为 ELF,以便能够在发行版更新之前尝试 EL 并获得其中的一些优势。他们仍然记得当初的困难。编者不会承认我就认识那些进行过这个尝试的人。

自 1995 年以来,ELF 一直是大多数体系架构上的 Linux 的标准可执行格式。人们可能会认为这已经提供了足够的时间让所有在使用 a.out 二进制文件的用户勉为其难地转向 ELF。此时此刻,如果还有人采用 a.out 的话可能被判断为不是一种过时的时尚。但是,在现实世界中总是有一些意外的。

最早一次关于移除 a.out 的讨论很快就停止了,但是当 Eric Biederman 发布了一个 patch 来在两个架构(Alpha 和 m68k)上禁止编译生成 a.out (而这两个架构仍然默认支持 a.out)时,又一次开始讨论了。这个 patch 实际上并没有删除掉相关支持,它只是关闭了这个功能,看看是否有人会抱怨出来。如果有人提出抗议的话,就可以迅速、轻松地恢复此功能,否则就可以完全删除了。

Linus Torvalds 很快回应,他 "非常确定我们不能这样做"。他指出,运行 Digital's Unix 的 Alpha 系统上的原生可执行格式本质上是 a.out,即使它有一个更加时尚的名字 ECOFF。Linux 的 a.out loader 加载器可以运行 ECOFF 程序,只是简单忽略了 ECOFF 中一些较新的特性,把它拿掉会导致那些仍然使用这种功能的系统出问题。人们可能会认为,仍然在使用 Alpha CPU、在这些 CPU 上运行 ECOFF 二进制文件、并保持使用最新内核版本的用户数量可能相当少,但谁也不无法确定。

Kees Cook 对似乎是唯一仍然支持 Alpha 的发行版(Gentoo)做了一点研究,发现唯一存在的 ECOFF 文件里包含了 firmware,而这些 firmware 无论如何都不能在 CPU 上运行。他的结论是,在这个平台上取消对 a.out 的支持不会有什么危害。"咱们动手吧"。

似乎总是会有人在事情快要成了的时候,要来毁掉这个成果。这一次,就在取消 a.out 似乎没有更多障碍的时候,James Jones 出现了,让人们知道他仍然在使用 a.out。

他的使用场景是在运行一套旧的工具来为 Atari Jaguar 构建程序。也就是说,Atari 的汇编器(mac)和链接器(aln)。另一个选择是在 dosbox 中运行 windows 版本,或者使用一些基于更老的、功能较少的老版本 mac 和 aln 源代码来开发的替代品,但它们仍然没有把那些建立一些程序或使用雅达利调试工具所必需的所有功能都加回来(这些功能也仅在 a.out 中才是可用的)。

他在后续邮件中给出了一些关于为什么他仍然需要使用这些工具的更多细节。

将一个程序转移到一个新的可执行格式,通常只是需要重新编译一下就好。但在没有源代码的情况下,就无法简单重新编译来完成了。那些专有软件用户可以找到很多乐趣,其中之一就是发现自己不得不试图在现代的系统上运行一个几十年前的二进制文件。许多人会在某个时候发现自己处于这种境地。他们是合法的 Linux 用户,而且也不希望破坏他们自己的系统。所以 Petkov 就明智地放弃了,只要求 Jones 记录一下他对 a.out 的使用方式,方便今后可能试图删除这个功能的人来参考。

然而,Cook 并没有这么快就放弃,他看了看有相关的程序,认为也许可以写一个 ELF wrapper 程序,可以加载和运行老版本的 a.out 二进制文件。一天后,他发布了这样一个程序,并指出它就可以运行 aln 程序,至少足以跑到提示说命令行参数不对的位置。Jones 试了一下之后,对结果很满意:

是的,效果很好,谢谢你。跟每次有人想删除 a.out 代码时都给我发一个电子邮件相比,我更喜欢你的这个主意和方式。可以认为我的使用场景已经不再是个问题了。我已经给我的 jaguar-sdk 项目推送了一个修改,可以来使用这个工具作为替代了。

所以删除 a.out 的支持又回到了 5.18 内核的计划中。也许这次的努力会成功,尽管仍然没有保证。可能有一些 a.out 用户没有意识到即将到来的这一个末日,因此还没有提出他们的反对意见。如果这些用户不能或不愿意使用 Cook 的 wrapper 工具,那么删除 a.out 的支持这个决策可能会再一次被推迟到未来的某个内核版本了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~



浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报