プロジェクトの.soライブラリの1つをすばやく修正したいです。 .soを再コンパイルして元のファイルを置き換えるのは安全ですか?あるいは、プロジェクト全体を再構築して再インストールする必要がありますか?それともそれは、linuxのプロジェクトの共有ライブラリ(.so)のいずれかで修正する方法は?
答えて
です。共有ライブラリは実行可能ファイルでbinary-compatibleにする必要があります。例えば
、
- あなたはライブラリの内部機能の一つの動作を変更した場合、あなたはおそらくは、再コンパイルする必要はありません。
- アプリケーションで認識されている構造体のサイズを変更した場合(たとえばメンバーを追加する場合)、再コンパイルする必要があります。それ以外の場合、ライブラリとアプリケーションは構造体がそれより小さいとみなし、ライブラリは、アプリケーションが書き込まなかった余分な初期化されていないメンバを読み込もうとします。
- アプリケーションから見える関数の引数の型または位置を変更すると、ライブラリはアプリケーションがスタックより多くの引数を読み込もうとするため、再コンパイルする必要があります(これはCの場合、C++の引数型は関数シグネチャの一部なので、アプリケーションはクラッシュするのではなく実行を拒否します)。
(製品リリースのための)親指のルールは、あなたがバイナリ互換性があるかわからバイナリ互換性を維持し、またはされていないことを意識的に認識していない場合は、再コンパイルする必要があり、ということです。
3に関して:デフォルトのパラメータへの変更はABIに全く影響しません。 cdecl呼び出し(C言語のデフォルトとGCCのthiscall)では、呼び出し元が実際にスタックをクリーンアップします。右から左への呼び出し規約では、予想よりも多くのパラメータを渡すこともできますが、それ以上ではありません。 –
@Matt、私は* default *引数、引数だけは述べていませんでした。 :)また、より多くの引数ではなく、ライブラリ側でより多くの引数で終わることが一般的です。したがって、ライブラリはガベージ値にアクセスしようとします。 –
これは確かにダイナミックライブラリを使用する意図です:ライブラリ内の何かが更新する必要がある場合は、ライブラリを更新するだけで、それを使用するプログラムを変更する必要はありません。変更している関数のシグネチャが変更されず、同じことが達成された場合、これは一般的に問題ありません。
もちろん、プログラムがドキュメント化されていない副作用に依存している場合があります。その後、その関数の実装を変更すると、副作用が変化してプログラムが中断することがあります。しかし、のc'est la vie。
共有ライブラリのABIを変更していない場合は、ライブラリを再構築して置き換えることができます。
ライブラリバイナリインタフェースを変更しない場合は、共有ライブラリのみを再コンパイルして再デプロイしても問題ありません。
グッド参照:それはイエス依存
。
しかし、あなたは他のものを組み込んだ正確に同じソースとコンパイラを持っていると仮定して、.cpp
ファイルで変更しただけの場合は問題ありません。
ヘッダーファイル内のインターフェース(共有libとシステムの残りの部分の間)を変更するのは問題ありません。
- 1. C++コードの共有64ビットLinux互換ライブラリ(* .so)の作成方法
- 2. jnaラッピング共有.soライブラリ - アクセスクラス
- 3. Linuxで共有メモリを使用する場合のセグメンテーションフォールト(コアダンプ)の修正方法
- 4. ELF用のプロキシ共有ライブラリ(sharedlib、shlib、so)?
- 5. linux共有のCライブラリが共有されていません
- 6. 私の.so共有ライブラリのLoadLibraryをC++から呼び出す方法
- 7. Androidスタジオ - プロジェクトに共有ライブラリ(.so)ファイルとヘッダー(.h)ファイルを追加
- 8. 共有ライブラリの壊れたリンクを修正しましたg ++
- 9. Linuxの共有ライブラリをデバッグする
- 10. Android Studioで共有* .soライブラリのリリース版を作成する
- 11. 共有オブジェクト(.so)からのLinux上の例外
- 12. automakeスクリプトで共有ライブラリ(.so)を作成するには?
- 13. .NETコアからlinuxプラットフォーム上の共有ライブラリ(.so)を呼び出すことは可能ですか?
- 14. 共有ライブラリ(.soファイル)をプライベートとしてロードするのはなぜですか?
- 15. 複数の.so共有ライブラリをマージする
- 16. IDEがヘッダーファイルから共有ライブラリ名.soを見つける方法.h
- 17. .soファイルのない共有ライブラリ用にビルド
- 18. アンドロイドスタジオの.so共有ライブラリ内のメソッドを呼び出す
- 19. djangoプロジェクトの共有ライブラリ用のフォルダはどこですか?
- 20. Androidプロジェクトの.soライブラリをインポート
- 21. Linux、Mono、共有ライブラリ、未解決のシンボル
- 22. 共有ライブラリとLinux(elf)のリンク
- 23. linux共有ライブラリのパフォーマンスローカルvfs nfs
- 24. Linux - 実行可能イメージ内の共有ライブラリリンクを修正するには?
- 25. ランタイムデバッグ共有ライブラリの方法は?
- 26. エラー共有ライブラリのlibstdC++のロード中so.5を
- 27. natvie windows DLLと共有Linuxライブラリの間に同等のものがありますか.SO
- 28. Linux上の共有ライブラリに関する良いプラクティスは何ですか?
- 29. Linuxで共有ライブラリの依存関係をリストするプログラミング方法
- 30. 共有プールでOracleクエリを修正する方法はありますか
メイクファイルでは、どのコンポーネントを再構築する必要がありますか?したがって、どのファイルを置き換えなければならないかを確認する必要があります。 –
@ott:あなたがそれを言わない限り、makeは実行時の.so depsについて知りません。間違いなく、ABIに関する決定を下すために必要なものを提供することは現実的ではありません。 –