2

私の組み込み Linux (TI AM335x) ボードには、サブフォルダー sysroot と filesystem を含む SDK があります。libz の例:

sysroot/.../usr/lib には以下が含まれます。

libz.so         # symbolic link to libz.so.1.2.7
libz.so.1       # symbolic link to libz.so.1.2.7
libz.so.1.2.7

filesystem/usr/lib/ が含まれています

libz.so.1       # symbolic link to libz.so.1.2.7
libz.so.1.2.7

ファイル システムにはシンボリック リンク libz.so --> libz.so.1.2.7 が含まれていません。しかし、私のリンカーはそれを望んでいます。だから私はそれを追加しました。私の質問: そのようなシンボリック リンクを提供しない一般的な理由はありますか? それによってどの目標が達成されますか?

4

2 に答える 2

2

これは、ライブラリにリンクするプログラムが、ライブラリの「実際の名前」にリンクされている「soname」のみを指定できるようにするためです。ライブラリをアップグレードすることにした場合、リンカーの構成を常に変更する必要はなく、リンカーは最新バージョンにリンクするようになりました。詳細については、こちらをご覧ください

于 2014-08-16T17:40:28.827 に答える
0
 Is there any common reason not provide such symbolic links? Which goal is achieved by that?

懸念される唯一の理由は、ライブラリのシンボリック リンク バージョンとインストールされたライブラリの間でライブラリ API の変更があるかどうかです。その場合、必要な関数名が見つからない場合はリンカ エラーが発生するか、すべての名前が同じであるが特定の関数の動作がバージョン間で変更されている場合は壊れたコードが発生します。共有ライブラリへのシンボリック リンクを手動で作成する場合、共有オブジェクト ライブラリのバージョン間で必要なライブラリ呼び出しが同じであることを確認する必要があります。一般に、ライブラリがそのsoname(共有オブジェクト名) を変更する場合、そのライブラリのユーザーが認識して適切な使用を確認する必要があるライブラリに根本的な変更があるためです。あなたが必要libz.soとし、あなたのシステムが持っているという事実libz.so.1は、そのような変更またはsoname バンプが発生したことを示します。から必要な機能libz.soが存在し、変更されていないことを確認する必要がありますlibz.so.1。(ほとんどの場合、ライブラリは下位互換性がありますが、そうでない場合もあります [例: libpng-1.2 と libpng-1.4])

それが sonames の要点です。シンボリックリンクを手動で作成するか、libz をダウングレードして必要なリンクを取得する必要がある状況に陥った場合libz.so、soname の変更により、libz.so と libz.so.1 の間にライブラリの変更があったことがわかります。あなたがやろうとしている方法でlibz.so.1シンボリックリンクを使用できることを確認するのはあなた次第libz.soです。

なぜシンボリックリンクが必要なのですか? シンボリックリンクなしのlibz.so.1代わりに使用するだけでコードが満足できないのはなぜですか? libz.soコンパイルしているコードは、 を探していlibz.soます。お気づきのとおり、システムには存在しません。libz.so -> libz.so.1シンボリック リンクを提供することにより、コードを変更せずに、コードlibz.so.1が名前から検索できるようになりますlibz.so。シンボリックリンクを作成することは、基本的には、コードを修正して動作するようにするためのハックlibz.so.1です。いずれかのシステムのコードへのアクセスに応じて、それが必要になる場合がありますが、この状況を処理する適切な方法は、両方のシステムとコードを更新して、現在のライブラリを使用してビルドすることです。libz.so.1

そうは言っても、変更が使用する必要のあるlibz.so.1部分に影響を与えないlibz.so場合、シンボリックリンクは問題なく機能します。

于 2014-08-16T20:33:46.850 に答える