🦁

Unix/Linuxのリンカーはなぜldという名前なのか

2023/02/04に公開

素朴な疑問

Unix/Linuxのリンカーはなぜldという名前なのでしょうね。

逆に私の知る限りではUnix/Linuxの流れをくむ物以外ではリンカーをldとは呼ばないです。1980年代のMS-DOSではアセンブラとリンカーが付属していましたが名前はそれぞれasm.exe, link.exe でした。
私が触ったことのある商用のコンパイラツールチェーンでもリンカーはlinkっぽい名前でした。

chatGPTに聞いてみました。

"link editor" の略だって。本当かなあ。

Google検索ではこれが見つかりました。

https://softwareengineering.stackexchange.com/questions/226573/why-is-the-unix-linker-called-ld

loader説とlink-editor説がありますね。

"Linker and Loaders" という書籍とそのPDFを見つけました。
https://www.wh0rd.org/books/linkers-and-loaders/linkers_and_loaders.pdf

私の大胆な仮説

コンピュータの黎明期までさかのぼって想像してみます。
当時はメモリは非常に高価だったので、実行するプログラムに対して十分なメモリサイズがなかったのではないかと考えられます。ライブラリ関数を呼び出すときにそれもメモリにロードしてアドレスを解決し、また別の関数を呼ぶときには、そのときに使っていない関数の領域を上書きするようにメモリにロードしていたのではないでしょうか。つまりメモリのオーバーレイをしていた。
そのときに、プログラムの断片をロードしてアドレスを解決するのがローダーの仕事。

その裏付けになるのが "Linker and Loaders"の序文。

As early as 1947, programmers started to use primitive loaders that could
take program routines stored on separate tapes and combine and relocate
them into one program. By the early 1960s, these loaders had evolved into
full-fledged linkage editors. Since program memory remained expensive
and limited and computers were (by modern standards) slow, these linkers
contained complex features for creating complex memory overlay structures to cram large programs into small memory, and for re-editing previously linked programs to save the time needed to rebuild a program from
scratch.

DeepLでの翻訳

1947年には、プログラマーは原始的なローダーを使い始めていた。
このローダーは、別々のテープに保存されているプログラムルーチンを組み合わせて
プログラマーは1947年頃から、別々のテープに保存されているプログラムルーチンを取り込んで、1つのプログラムに結合したり再配置したりする原始的なローダーを使い始めました。1960年代初頭には、これらのローダーは本格的なリンケージエディタに進化していた。
本格的なリンケージエディタに進化していた。プログラムメモリは高価で
このため、リンカは複雑なメモリーオーバーを実現する機能を備えていた。
を作成したり、リンク済みのプログラムを再編集して、プログラムを一から作り直す時間を短縮するための複雑な機能が搭載されていた。
また、リンク済みのプログラムを再編集して、ゼロからプログラムを作り直す時間を短縮するための複雑な機能も備えていた。

これは私の大胆な仮説です。
時代が下ってプログラムを格納するのに十分なメモリを搭載できるようになったときに、ローダーは、必要なオブジェクトを全部1回でリンクするようになり、さらにそれをメモリでなくファイルに書き出せるように機能追加されたのだと思います。このように使い方が変化したのにもかかわらずUnixではにコマンドの名前を変更しないままだったのでローダーの意味の'ld'がそのまま残ってリンカーとして使うようになったのではないでしょうか。

現代では'ld'と名がつくもう一つのコマンドがあります。ダイナミックリンクしている実行ファイルの裏で動くld.soです。

$ man ld.so
NAME
       ld.so, ld-linux.so - dynamic linker/loader

SYNOPSIS
       The  dynamic  linker  can  be run either indirectly by running some dynamically linked
       program or shared object (in which case no command-line options to the dynamic  linker
       can  be passed and, in the ELF case, the dynamic linker which is stored in the .interp
       section of the program is executed) or directly by running:

       /lib/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]
 ...

一周回って、これが黎明期のloaderに近い働きをしていますね。

少し前のTweet

https://twitter.com/tetsu_koba/status/1479693470231318535?conversation=none
https://twitter.com/tetsu_koba/status/1479694264921915394?conversation=none
https://twitter.com/tetsu_koba/status/1479695247605403649?conversation=none
https://twitter.com/tetsu_koba/status/1479696953667887104?conversation=none
https://twitter.com/n_soda/status/1479694476625190922?conversation=none

Discussion