web-dev-qa-db-ja.com

glibcを更新すると、システムがどの程度正確に機能しなくなる可能性がありますか?

パッケージを介してシステムで利用できない新しい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で上書きしている場合、古いアプリを壊したり、システムを破損?

それとも…? :)

5

一般に、古い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が原因で製品が破損する可能性があるとも言えます。

だから私が与えることができる最良の答えは:
「何かを壊すことは想定されていない、そしてそれが起こらない可能性は非常に高い」。

詳細については、以下を参照してください。

4
harrymc

あなたの質問に対するdirectの答えは、newer(必ずしもサポートされていない)バージョンを使用する場合です。関数が削除されていない、または変更されていない、他の(古い)アプリケーションがそのような方法であるという保証はありません。これらの変更に対処できるようになります。実際、新しいバージョンが、いわゆる「レガシー」機能をサポートするための「シム」を提供していない場合、それらは新しいバージョンに対処できません削除、または非互換変更

したがって、努力の成功を期待している場合は、「サポートされている」Glibcバージョンに続くChangelog(s)を調べる必要があります。何が変更されたかを安全に判断するため。 :)

0
somebody