1. ホーム
  2. c++

[解決済み】macOSの.soと.dylibの違いは何ですか?

2022-04-17 13:06:55

質問

.dylibはmacOSのダイナミックライブラリ拡張ですが、従来のunixの.so共有オブジェクトを使えない/使うべきではない場合というのは、これまで明確には分かっていませんでした。

疑問に思っていることをいくつか。

  • 概念的には、.soと.dylibの主な違いは何ですか?
  • どのような場合にどちらを使うべきですか?
  • コンパイルのコツとヒント(例えば、gcc -shared -fPICはOSXでは動作しないので、その代わりとなるものなど。)

解決するには?

Mac OS X が実行ファイルとライブラリに使用している Mach-O オブジェクトファイル形式は、次のように区別されます。 シェアードライブラリ 動的にロードされるモジュール . 使用方法 otool -hv some_file のファイルタイプを見るには some_file .

Mach-Oの共有ライブラリは、ファイルタイプが MH_DYLIB で、拡張子は.dylibです。これらは、通常の静的リンカーフラグでリンクすることができます。 -lfoo libfoo.dylib の場合。 を渡すことで、作成することができます。 -dynamiclib フラグをコンパイラに渡します。( -fPIC はデフォルトであり、指定する必要はありません)。

ロード可能なモジュールはMach-O用語でバンドルと呼ばれます。これらは、ファイルタイプ MH_BUNDLE . これらは任意の拡張子を持つことができ、拡張子は .bundle はAppleが推奨していますが、ほとんどの移植ソフトは .so は、互換性を保つためです。 一般的に、バンドルは プラグイン そのような状況では、バンドルはアプリケーションのバイナリに対してリンクし、アプリケーションのエクスポートされた API にアクセスできるようにします。 バンドルは -bundle フラグをコンパイラに設定します。

dylibs と bundles の両方が動的に読み込まれるようにするには dl API(例. dlopen , dlclose ). バンドルに対して、あたかも共有ライブラリのようにリンクすることはできません。しかし、バンドルが実際の共有ライブラリに対してリンクされることはありえます;それらはバンドルがロードされるときに自動的にロードされます。

歴史的には、もっと大きな違いがあった。 Mac OS X 10.0では、ライブラリを動的にロードする方法はありませんでした。 dyld API のセット (例. NSCreateObjectFileImageFromFile , NSLinkModule ) はバンドルのロードとアンロードのために 10.1 で導入されましたが、dylibs では動きませんでした。 A dlopen バンドルで動作する互換ライブラリが 10.3 で追加され、10.4 では dlopen はdyldのネイティブな部分として書き直され、dylibのロード(アンロードは不可)のサポートが追加されました。最後に、10.5 では dlclose をdylibsと一緒に使用し、dyldのAPIを非推奨としました。

Linux などの ELF システムでは。 は同じファイル形式を使用します。 共有コードはライブラリとして、またダイナミックローディングのために使用することができます。

最後に、Mac OS Xでは、注意が必要です。 "バンドル" できる また は、実行可能なコードとそのコードによって使用されるリソースを保持する標準的な構造を持つディレクトリを指します。 概念的には重なる部分がありますが(特にプラグインのようなquot;loadable bundles"は一般にMach-Oバンドルの形で実行可能コードを含む)、上で述べたMach-Oバンドルと混同されるべきではありません。

その他の参考文献