LWN:刪除 a.out 支持!
關(guān)注了就能看到更多這么棒的文章哦~
A way out for a.out
By Jonathan Corbet
March 24, 2022
DeepL assisted translation
https://lwn.net/Articles/888741/
a.out 這種可執(zhí)行文件格式(executable format)可以追溯到 Linux 最早期的時(shí)候,甚至比那還要早。幾十年來,都沒有采用認(rèn)真的方式來使用它,但是 Linux 內(nèi)核中仍然存在對(duì)它的支持,并且拒絕了所有申請(qǐng)將它刪除的提議。早在一月份的時(shí)候,Borislav Petkov 再次試圖刪除對(duì)這種格式的支持,引出了另一次長時(shí)間的討論。不過,這次有一個(gè)不同之處:擺脫 a.out 支持的目標(biāo)可能會(huì)達(dá)成。
a.out 格式可以追溯到 Unix 的第一版。當(dāng) MINIX 出現(xiàn)時(shí),它自然而然地將這種格式用于此系統(tǒng)中的可執(zhí)行文件,這進(jìn)而導(dǎo)致 a.out 也被用于 Linux。這是一種簡單的格式,它在 Linux 上的實(shí)現(xiàn)甚至更簡單。每一個(gè) Linux 共享庫都必須被集中分配自己的地址空間,因?yàn)閹旌瘮?shù)在運(yùn)行時(shí)不能被改變位置。盡管如此,Linux 還是使用了.out 挺長一段時(shí)間,直到 1993 年 0.99.13 版本的開發(fā)內(nèi)核中首次加入了對(duì)新興的 ELF 格式的支持。
有一段時(shí)間,我們中一些比較瘋狂的人手動(dòng)將 Slackware 系統(tǒng)從 a.out 轉(zhuǎn)換為 ELF,以便能夠在發(fā)行版更新之前嘗試 EL 并獲得其中的一些優(yōu)勢(shì)。他們?nèi)匀挥浀卯?dāng)初的困難。編者不會(huì)承認(rèn)我就認(rèn)識(shí)那些進(jìn)行過這個(gè)嘗試的人。
自 1995 年以來,ELF 一直是大多數(shù)體系架構(gòu)上的 Linux 的標(biāo)準(zhǔn)可執(zhí)行格式。人們可能會(huì)認(rèn)為這已經(jīng)提供了足夠的時(shí)間讓所有在使用 a.out 二進(jìn)制文件的用戶勉為其難地轉(zhuǎn)向 ELF。此時(shí)此刻,如果還有人采用 a.out 的話可能被判斷為不是一種過時(shí)的時(shí)尚。但是,在現(xiàn)實(shí)世界中總是有一些意外的。
最早一次關(guān)于移除 a.out 的討論很快就停止了,但是當(dāng) Eric Biederman 發(fā)布了一個(gè) patch 來在兩個(gè)架構(gòu)(Alpha 和 m68k)上禁止編譯生成 a.out (而這兩個(gè)架構(gòu)仍然默認(rèn)支持 a.out)時(shí),又一次開始討論了。這個(gè) patch 實(shí)際上并沒有刪除掉相關(guān)支持,它只是關(guān)閉了這個(gè)功能,看看是否有人會(huì)抱怨出來。如果有人提出抗議的話,就可以迅速、輕松地恢復(fù)此功能,否則就可以完全刪除了。
Linus Torvalds 很快回應(yīng),他 "非常確定我們不能這樣做"。他指出,運(yùn)行 Digital's Unix 的 Alpha 系統(tǒng)上的原生可執(zhí)行格式本質(zhì)上是 a.out,即使它有一個(gè)更加時(shí)尚的名字 ECOFF。Linux 的 a.out loader 加載器可以運(yùn)行 ECOFF 程序,只是簡單忽略了 ECOFF 中一些較新的特性,把它拿掉會(huì)導(dǎo)致那些仍然使用這種功能的系統(tǒng)出問題。人們可能會(huì)認(rèn)為,仍然在使用 Alpha CPU、在這些 CPU 上運(yùn)行 ECOFF 二進(jìn)制文件、并保持使用最新內(nèi)核版本的用戶數(shù)量可能相當(dāng)少,但誰也不無法確定。
Kees Cook 對(duì)似乎是唯一仍然支持 Alpha 的發(fā)行版(Gentoo)做了一點(diǎn)研究,發(fā)現(xiàn)唯一存在的 ECOFF 文件里包含了 firmware,而這些 firmware 無論如何都不能在 CPU 上運(yùn)行。他的結(jié)論是,在這個(gè)平臺(tái)上取消對(duì) a.out 的支持不會(huì)有什么危害。"咱們動(dòng)手吧"。
似乎總是會(huì)有人在事情快要成了的時(shí)候,要來毀掉這個(gè)成果。這一次,就在取消 a.out 似乎沒有更多障礙的時(shí)候,James Jones 出現(xiàn)了,讓人們知道他仍然在使用 a.out。
他的使用場(chǎng)景是在運(yùn)行一套舊的工具來為 Atari Jaguar 構(gòu)建程序。也就是說,Atari 的匯編器(mac)和鏈接器(aln)。另一個(gè)選擇是在 dosbox 中運(yùn)行 windows 版本,或者使用一些基于更老的、功能較少的老版本 mac 和 aln 源代碼來開發(fā)的替代品,但它們?nèi)匀粵]有把那些建立一些程序或使用雅達(dá)利調(diào)試工具所必需的所有功能都加回來(這些功能也僅在 a.out 中才是可用的)。
他在后續(xù)郵件中給出了一些關(guān)于為什么他仍然需要使用這些工具的更多細(xì)節(jié)。
將一個(gè)程序轉(zhuǎn)移到一個(gè)新的可執(zhí)行格式,通常只是需要重新編譯一下就好。但在沒有源代碼的情況下,就無法簡單重新編譯來完成了。那些專有軟件用戶可以找到很多樂趣,其中之一就是發(fā)現(xiàn)自己不得不試圖在現(xiàn)代的系統(tǒng)上運(yùn)行一個(gè)幾十年前的二進(jìn)制文件。許多人會(huì)在某個(gè)時(shí)候發(fā)現(xiàn)自己處于這種境地。他們是合法的 Linux 用戶,而且也不希望破壞他們自己的系統(tǒng)。所以 Petkov 就明智地放棄了,只要求 Jones 記錄一下他對(duì) a.out 的使用方式,方便今后可能試圖刪除這個(gè)功能的人來參考。
然而,Cook 并沒有這么快就放棄,他看了看有相關(guān)的程序,認(rèn)為也許可以寫一個(gè) ELF wrapper 程序,可以加載和運(yùn)行老版本的 a.out 二進(jìn)制文件。一天后,他發(fā)布了這樣一個(gè)程序,并指出它就可以運(yùn)行 aln 程序,至少足以跑到提示說命令行參數(shù)不對(duì)的位置。Jones 試了一下之后,對(duì)結(jié)果很滿意:
是的,效果很好,謝謝你。跟每次有人想刪除 a.out 代碼時(shí)都給我發(fā)一個(gè)電子郵件相比,我更喜歡你的這個(gè)主意和方式。可以認(rèn)為我的使用場(chǎng)景已經(jīng)不再是個(gè)問題了。我已經(jīng)給我的 jaguar-sdk 項(xiàng)目推送了一個(gè)修改,可以來使用這個(gè)工具作為替代了。
所以刪除 a.out 的支持又回到了 5.18 內(nèi)核的計(jì)劃中。也許這次的努力會(huì)成功,盡管仍然沒有保證??赡苡幸恍?a.out 用戶沒有意識(shí)到即將到來的這一個(gè)末日,因此還沒有提出他們的反對(duì)意見。如果這些用戶不能或不愿意使用 Cook 的 wrapper 工具,那么刪除 a.out 的支持這個(gè)決策可能會(huì)再一次被推遲到未來的某個(gè)內(nèi)核版本了。
全文完
LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。
長按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開源社區(qū)的各種新近言論~
