2011-09-15 4 views
5

プロジェクトの.soライブラリの1つをすばやく修正したいです。 .soを再コンパイルして元のファイルを置き換えるのは安全ですか?あるいは、プロジェクト全体を再構築して再インストールする必要がありますか?それともそれは、linuxのプロジェクトの共有ライブラリ(.so)のいずれかで修正する方法は?

+0

メイクファイルでは、どのコンポーネントを再構築する必要がありますか?したがって、どのファイルを置き換えなければならないかを確認する必要があります。 –

+0

@ott:あなたがそれを言わない限り、makeは実行時の.so depsについて知りません。間違いなく、ABIに関する決定を下すために必要なものを提供することは現実的ではありません。 –

答えて

4

です。共有ライブラリは実行可能ファイルでbinary-compatibleにする必要があります。例えば

  1. あなたはライブラリの内部機能の一つの動作を変更した場合、あなたはおそらくは、再コンパイルする必要はありません。
  2. アプリケーションで認識されている構造体のサイズを変更した場合(たとえばメンバーを追加する場合)、再コンパイルする必要があります。それ以外の場合、ライブラリとアプリケーションは構造体がそれより小さいとみなし、ライブラリは、アプリケーションが書き込まなかった余分な初期化されていないメンバを読み込もうとします。
  3. アプリケーションから見える関数の引数の型または位置を変更すると、ライブラリはアプリケーションがスタックより多くの引数を読み込もうとするため、再コンパイルする必要があります(これはCの場合、C++の引数型は関数シグネチャの一部なので、アプリケーションはクラッシュするのではなく実行を拒否します)。

(製品リリースのための)親指のルールは、あなたがバイナリ互換性があるかわからバイナリ互換性を維持し、またはされていないことを意識的に認識していない場合は、再コンパイルする必要があり、ということです。

+0

3に関して:デフォルトのパラメータへの変更はABIに全く影響しません。 cdecl呼び出し(C言語のデフォルトとGCCのthiscall)では、呼び出し元が実際にスタックをクリーンアップします。右から左への呼び出し規約では、予想よりも多くのパラメータを渡すこともできますが、それ以上ではありません。 –

+0

@Matt、私は* default *引数、引数だけは述べていませんでした。 :)また、より多くの引数ではなく、ライブラリ側でより多くの引数で終わることが一般的です。したがって、ライブラリはガベージ値にアクセスしようとします。 –

1

これは確かにダイナミックライブラリを使用する意図です:ライブラリ内の何かが更新する必要がある場合は、ライブラリを更新するだけで、それを使用するプログラムを変更する必要はありません。変更している関数のシグネチャが変更されず、同じことが達成された場合、これは一般的に問題ありません。

もちろん、プログラムがドキュメント化されていない副作用に依存している場合があります。その後、その関数の実装を変更すると、副作用が変化してプログラムが中断することがあります。しかし、のc'est la vie

1

共有ライブラリのABIを変更していない場合は、ライブラリを再構築して置き換えることができます。

1

しかし、あなたは他のものを組み込んだ正確に同じソースとコンパイラを持っていると仮定して、.cppファイルで変更しただけの場合は問題ありません。

ヘッダーファイル内のインターフェース(共有libとシステムの残りの部分の間)を変更するのは問題ありません。

関連する問題