0

私は非常に奇妙な問題を抱えています。1 つのソフトウェア ソースから、静的 (ar を使用) と動的 (gcc を使用) の 2 つのライブラリを構築します。テスト アプリケーションを動的ライブラリにリンクすると、問題なく動作します。しかし、静的ライブラリにリンクされたテスト アプリケーションには、「セグメンテーション違反」または「未処理の障害: アライメント例外 ... 不正な命令」が存在します。

なんで?ソフトウェア コードにバグがあることはわかっていますが、スタティック ライブラリを使用した場合、メモリ アラインメントに違いはありますか?

4

1 に答える 1

1

静的リンクと動的リンクの定義を見ると、問題の 2 つのバイナリのメモリ レイアウトが大きく異なることが明らかです。

静的リンクでは、リンカー シンボル テーブルで作成された依存関係を満たすために必要なすべてのオブジェクト コードが、結果のバイナリに含まれます。

動的リンクを使用すると、これらの依存関係は、バイナリのロード時にローダーが満たそうとするプレースホルダーに書き換えられます。実際のオブジェクト コードは、動的ライブラリに存在するアラインメント要件に従って、メモリ内のどこかに読み込まれます。

したがって、最大の違いは、バイナリに含まれるオブジェクト コードです。静的ライブラリに何かが含まれ、実行が狂います。問題を特定するために、コード検査と一緒にライブラリ コードに対して選択的な単体テストを実行することをお勧めします。

于 2012-04-04T13:05:21.073 に答える