パッケージを介してシステムで利用できない新しいglibcバージョンに依存するプログラムがあるとします。そしてそれは与える:
version `GLIBC_2.xxx' not found
1つの解決策は、バイナリをglibcで静的にコンパイルすることです。
多くの人が「安全ではない」と脱線しているもう1つの解決策は、オペレーティングシステムで出荷されているものではなく、新しいlibc.so.6
を配置することです。
libc.so.6
に以前のABIエンドポイントが含まれている場合、この2番目のソリューションはどのように正確に安全または悪い考えではありませんか?
例えば。 strings /usr/lib/libc.so.6 | grep --Perl-regexp "^GLIBC_"
を実行すると、次のようなABIバージョンが多数表示されます。
...
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
...
したがって、additionalglibcABIバージョンを含む新しいlibc.so.6
で上書きしている場合、古いアプリを壊したり、システムを破損?
それとも…? :)
一般に、古いglibcバージョン用にコンパイルされたバイナリは、新しいglibcを備えたシステムで正常に実行されます。これは、glibcが下位互換性があり、 アプリケーションバイナリインターフェイス(ABI) への変更を自動的に処理するためです。基本的に各シンボルにそのglibcバージョンを指定するタグが付けられるシンボルバージョン管理を使用することにより、このウィザードを実現します。
関数呼び出しのセマンティクスが変更された場合、glibcには古いセマンティクス用と新しいセマンティクス用の2つのバージョンが含まれるため、各関数にはそのバージョンのタグが付けられます。リンカは、両方のバージョンを2つの異なる関数と見なします。
Glibcは1つのファイルではなく、多数の部分(200を超える共有ライブラリ)で構成されているため、この高度なメカニズムが必要です。
Glibcバージョンの下位互換性は常に追跡されています。 glibcのAPI/ABI変更レビュー については、ABIラボレポートを参照してください。レポートは、 abi-compliance-checker および abi-tracker ツールによって生成されます。
あなたの質問のために:
では、追加のglibc ABIバージョンを含む新しいlibc.so.6で上書きしている場合、古いアプリを壊したり、システムを壊したりするにはどうすればよいでしょうか。それとも…?
Glibcの互換性は絶対確実ではありませんが、それを破るには、かなり古いLinuxバージョンでコンパイルされた製品に戻る必要があると思います。また、コンパイルされた場所とは異なるバージョンのLinuxで実行すると、glibcが原因で製品が破損する可能性があるとも言えます。
だから私が与えることができる最良の答えは:
「何かを壊すことは想定されていない、そしてそれが起こらない可能性は非常に高い」。
詳細については、以下を参照してください。
あなたの質問に対するdirectの答えは、newer(必ずしもサポートされていない)バージョンを使用する場合です。関数が削除されていない、または変更されていない、他の(古い)アプリケーションがそのような方法であるという保証はありません。これらの変更に対処できるようになります。実際、新しいバージョンが、いわゆる「レガシー」機能をサポートするための「シム」を提供していない場合、それらは新しいバージョンに対処できません削除、または非互換変更。
したがって、努力の成功を期待している場合は、「サポートされている」Glibcバージョンに続くChangelog(s)
を調べる必要があります。何が変更されたかを安全に判断するため。 :)