質問: linuxにおける共有ライブラリの運用について教えてください。 linuxでは共有ライブラリを管理するためにlinker name, soname, real nameの3つの名前を使うと聞きました。 リンク先の記述を見て下記のように運用すると理解しました。 * バイナリ互換性のあるバージョン 旧バージョンに対して、real nameは異なるが、sonameは同じ。 (real nameのマイナー番号かリリース番号を上げ、sonameのバージョン番号は変更しない。) * バイナリ非互換となったバージョン 旧バージョンに対して、real name, sonameの両方が異なる。 (real name/soname両方のバージョン番号を上げる。) * ldconfigを実行 共有ライブラリ・ファイルに記録されているsonameを使ってシンボリック・リンク・ファイルが生成され、それはreal nameのファイルを指す。 ということは、その共有ライブラリを使う側はsonameを指定してリンク指示すれば、バイナリ互換性のある共有ライブラリにリンクでき、皆幸せになれそうです。(Windowsも同様な仕組みを設ければ良いのに。) ### 質問です 1. linker nameにはバージョン番号を含まないようです 上記リンク先ではlinker nameにはバージョン番号を含んでいません。 他のサイトでもそのような解説でした。ここもそうです。 しかし、バイナリ非互換な共有ライブラリにリンクするのはあり得ないように感じます。 何故、linker nameにはバージョン番号を含まないのでしょうか? このように書いているサイトしか見つからないので自信はないのですが、リンク先サイトのミスですよね? 2. 同じsonameに対して複数のreal nameの必要性 互換性があるので単純に共有ライブラリを上書きすれば、sonameによるシンボリックリンクは不要な気がします。(Windowsでも、そのような運用であれば可能なので検討してます。) ただ、古い共有ライブラリ・ファイルを残したままバージョンアップできれば、新しいもので何か不具合が起きた時、古いものへ簡単に戻せます。 これがsonameに対して複数のreal nameを対応させる主なメリットでしょうか? また、他にも何か目的(メリット)はあるでしょうか? ### 私なりの結論(2017/01/19追記) Windowsでは大変頭の痛い非互換なバージョンのライブラリへのリンクを回避できるスマートな技術としてsonameとldconfigがlinuxには存在しています。 そして、David A. Wheeler氏がその折角の技術を無にして、互換性を問わず最新のライブラリとリンクさせるバージョン番号のないlinker nameを提案されています。 その理由が下記のように書かれています。 > > ほとんどの場合において、ライブラリを更新したら、リンク時にそれを自動的に利用したいと思うでしょうから > > > アプリケーションを更新した時は最新版を使いたい人がほとんどですね。 ライブラリを更新した時に、それを使うアプリケーションが起動しなくなるリスクを冒したい人はほとんどいないと思います。 「前者と混同し、かつ、linuxでは対策されているのであまり発生しない後者の問題を見落とした結果、バージョン番号のないlinker nameが提案され、それをなんとなく納得してしまった人が多数いる」を、現時点での私なりの結論と致します。 とはいえ、自分で書いておきながら、このような間違いを多くの人が冒していると言う説には無理を感じます。 もし、linker nameが存在した方がよい理由をご存知の方、もしくは、推測のある方がいらっしゃいましたら、教えて頂けると幸いです。 逆に、「libtoolを使っていないライブラリの場合、バージョン番号のないlinker nameによるシンボリックリンクを生成するインストーラなんて実際にはないよ」と言う情報があると大歓迎です。
回答: > > 1. linker nameにはバージョン番号を含まないようです > > > ライブラリーの利用者(プログラマー)はインストールされている最新のバージョンを使おうという場合もあり得ると思います。下記のリンクにそうしたことについて簡単な記述があります。つまりはそういう目的で使うためにlinker nameがあるように思います。 3.1.1. 共有ライブラリ名 > > 2. 同じsonameに対して複数のreal nameの必要性 > > これがsonameに対して複数のreal nameを対応させる主なメリットでしょうか? > > > そういうこということだと思います。 > > Windowsも同様な仕組みを設ければ良いのに > > > .NETなんかはそういう仕組みに近い方式を採用していると思います。 ちなみにインターネットにある様々なページの信頼度は様々です。情報はなるべく「より発信源に近いところ」をみると確実度が高いと思います。「調べたことを個人的なメモとして残しておいた」的なページも有用なことは多いでしょうが、自分は沢山のページがヒットしそうな情報はなるべく大元に近いページを参照するようにしたほうがいいと思います。つまり`someone.com`より`linux.or.jp`や`or.jp`の方を見てみるという配慮もあったらいいと思います。