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も同様な仕組みを設ければ良いのに。)
質問です
- linker nameにはバージョン番号を含まないようです
上記リンク先ではlinker nameにはバージョン番号を含んでいません。
他のサイトでもそのような解説でした。ここもそうです。
しかし、バイナリ非互換な共有ライブラリにリンクするのはあり得ないように感じます。
何故、linker nameにはバージョン番号を含まないのでしょうか?
このように書いているサイトしか見つからないので自信はないのですが、リンク先サイトのミスですよね?
- 同じ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によるシンボリックリンクを生成するインストーラなんて実際にはないよ」と言う情報があると大歓迎です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/16 12:22
2017/01/16 12:27
2017/01/16 14:38
2017/01/17 01:06
2017/01/17 03:20
2017/01/17 04:06
2017/01/17 04:25