3

私は ABI クロスチェック ツールを探し回っています。今、私はこれらの質問のような他の質問で提案されたツールのいくつかに会いました:

バイナリ互換性を自動的にテストする方法は?

C++ で ABI ブレークを検出する静的解析ツール

現在、これはまさに私がやろうとしていることではありません - これらはバージョン間の ABI の変更を追跡するためです。

特定のプロジェクト ソース ファイル + ライブラリ ヘッダー ファイルとライブラリ .so ファイル、およびコンパイラ バージョン (ライブラリとプロジェクトの両方のコンパイルに使用される) があれば、ABI の出力をクロス チェックできるのではないかと考えていました。コンパイルされたライブラリと一致しますか?

したがって、これが適用される状況は、アップストリーム ライブラリが libfoo.so および libfood.so を出荷した場合です。food の ABI は少し異なりますが (float ではなく double など)、コンパイルできないほどではありません。

  • コンパイルされた実行可能ファイルが正しいライブラリにリンクされていることを示すテスト (おそらく防弾ではない) を考え出すことは可能ですか?
  • これを行うツールはありますか?
4

2 に答える 2

1

C でしかコーディングしていないと仮定した場合libfoo.so(ヘッダファイルも持っていない場合)、共有オブジェクトのシンボルテーブルには何も含まれていないため、内部の関数の署名など​​を知る方法はありません。タイピング情報 (たとえばmalloc、通常のヒープ割り当てを行う代わりに、2 つの整数を加算してその合計を返す関数をライブラリに含めることを妨げるものは、従来の知恵以外にはありません)。

したがって、libfoo.so悪用される可能性があります。ただし、通常、一部の共有ライブラリにはシンボルに関連付けられたバージョンがあります (ライブラリを編集した場合は、 dlvsymdlopenを使用してプログラムでクエリを実行できます)。バージョンを生成するいくつかの方法があります。

ライブラリが純粋な C++ の場合、シンボルはマングルされるため、エンコーディングには署名が含まれます。

ベスト プラクティスは、ライブラリのバージョンを返すいくつかの関数をライブラリ内に持つことです。良い例として、glib バージョン情報関数を見てください。

于 2012-01-10T06:31:51.733 に答える
1

ABI コンプライアンス チェッカーは、2 つのライブラリ間の変更に対するアプリケーションの公開のチェックもサポートしているようです。

于 2013-07-13T19:13:01.837 に答える