1

私はかなり大きなCコードを引き継ぎました。古いバージョンの共有ライブラリを必要とするレガシーバイナリがたくさんあります。サーバーには、これらの正確なライブラリのバージョンはありません。古いバージョンを新しいバージョンに接続するシンボリックリンクを再コンパイルまたはセットアップできます。シンボリックリンクの設定には時間がかかります-これを行うための標準的またはスマートな方法はありますか?私はこれに不慣れであり、ヒントをいただければ幸いです。これはすべてCおよびFreeBSD環境です。

ありがとう。

4

2 に答える 2

2

一般に、レガシーコードを新しいライブラリで更新する場合は、ソースコードを新しいライブラリとそのインクルードに対して再コンパイルしてチェックを実行するのが最適です。これにより、コンパイラを使用して、データ型、関数署名などの領域で新旧のライブラリ間の不整合をチェックできます。

再コンパイルすることで、新しいライブラリが必要なすべての依存関係を提供していることを確認することもできます。

最後に、再コンパイルを実行すると、実際にすべてを再コンパイルしてリンクでき、必要なコンポーネントがすべて揃っていることを確認できます。

シンボリックリンクを使うなど、近道をするのは違和感があります。

于 2012-08-23T17:59:06.517 に答える
2

共有ライブラリのバージョン番号は、ABIが変更された場合にのみ変更されることになっています。(古いバージョンのFreeBSDはこれを正しく理解していませんでした。最近のバージョンでは修正されていますが、システムライブラリのみです!)したがって、これらのアプリケーションを正しく動作させる唯一の方法は、アプリケーションを再コンパイルするか、正確なバージョンを提供することです。それらがリンクされた共有ライブラリ。古いバージョンのFreeBSDシステムライブラリのみに依存するプログラムの場合、compat [45678] xパッケージをインストールできます。これは、指定されたバージョンのOSで提供されるライブラリのバージョンを提供しますが、重大な落とし穴があります。

1)アプリケーションが依存するライブラリの一部が、アプリケーション自体よりも新しいバージョンの標準ライブラリにリンクされている場合、ダイナミックリンカは標準ライブラリの2つの互換性のないコピーを提供し、動作しない可能性があります。

2)アプリケーションがdlopen()を使用して外部モジュールまたはプラグインをロードする場合、これらのモジュールはバージョン管理されていないため、すべての賭けはオフになります。

FreeBSD 8以降では、Cライブラリおよびその他の重要なシステムライブラリにシンボルバージョン管理を使用しているため、これらのライブラリはライブラリバージョンを再度変更することはなく、ABIの互換性は維持されます。多くのサードパーティ開発者はそれほど注意を払っていません。ライブラリのバージョンを変更せずにABIを壊し、ABIを壊さずにライブラリのバージョンを変更するため、勝つことはできません。(一部の開発者はドキュメントを読んでおらず、共有ライブラリのバージョン番号は製品のバージョン番号と同じである必要があると考えています。)

于 2012-10-02T20:30:11.197 に答える