私たちのプロジェクト (C++、Linux、gcc、PowerPC) は、いくつかの共有ライブラリで構成されています。パッケージの新しいバージョンをリリースするときは、ソース コードが実際に影響を受けるライブラリのみを変更する必要があります。「変更」とは、絶対的なバイナリ IDを意味します (ファイルのチェックサムが比較されます。異なるチェックサム -> ポリシーに従って異なるバージョン)。(コードが変更されたか、ライブラリごとでなくても、プロジェクト全体が常に一度にビルドされることに注意してください)。
通常、これは、含まれているヘッダー ファイルの非公開部分を非表示にし、公開部分を変更しないことで実現できます。
ただし、ライブラリ libTableManager.so のクラス TableManager (TableManager.cpp ファイル内!) のデストラクタに単なるdelete
追加が行われているにもかかわらず、ライブラリ libB.so (クラス TableManager を使用する) のバイナリ/チェックサムが追加されている場合がありました。が変更されました。
TableManager.h:
class TableManager
{
public:
TableManager();
~TableManager();
private:
int* myPtr;
}
TableManager.cpp:
TableManager::~TableManager()
{
doSomeCleanup();
delete myPtr; // this delete has been added
}
libB.so を で検査readelf --all libB.so
し、.dynsym セクションを調べると、他のライブラリから動的に使用されるものも含め、すべての関数の長さが libB に格納されていることがわかりました。次のようになります (長さは 3 列目の 668 です)。
527: 00000000 668 FUNC GLOBAL DEFAULT UND _ZN12TableManagerD1Ev
だから私の質問は:
- 関数の長さが実際にクライアント ライブラリに格納されるのはなぜですか? 開始アドレスで十分ではないでしょうか?
- libB.so のコンパイル/リンク (一種の「ストリッピング」) の際に、これを何らかの形で抑制することはできますか? この依存度を減らしたいのですが...