現在、私はとを構築しfoo.h
てfoo.c
います:
$ clang -I . -dynamiclib \
-undefined dynamic_lookup \
-o foo.dylib foo.c
私はこれを次のような他のCライブラリで使用することができます:
clang -I . -dynamiclib \
-undefined dynamic_lookup \
-o bar.dylib bar.c foo.dylib
このライブラリをアセンブリプロジェクトで使用したいと思います。
$ nasm -f macho64 test.asm \
&& ld -e start -macosx_version_min 10.13.0 -static -o test test.o foo.dylib
$ ./test
ld: warning: foo.dylib, ignoring unexpected dylib file
C関数をasmで動作させるために、C-> asmシステムをどのようにリンクするのか疑問に思います。次に、さらに進んで、コンパイルされたasmをCまたはasmプロジェクトのいずれかで使用するために使用したいので、それをどのように行うのか疑問に思います。
Cでアセンブリを使用する場合、基本的に関数を取得してインポートする#include "myassembly.h"
などしてほしいので、本物のライブラリのように感じます。次にmyfunc
、アセンブリで定義されているような関数がありますが、cではそれをmyfunc(1, 2, 3);
一種の物として使用できます。
-lSystem
フラグを使用して静的リンクから動的リンクに変更すると(そして削除すると-static
)、次のようになります。
dyld: Library not loaded: foo.dylib
Referenced from: ./test
Reason: image not found
make: *** [...] Abort trap: 6
あなたは-static
どちらの意味を指定しています:
-static Produces a mach-o file that does not use the dyld. Only used building the kernel.
dyld
ダイナミックローダーです。ダイナミックローダーを使用していない場合、ダイナミックライブラリを使用することはできません。
編集された質問の更新:
dylibが作成されると、「インストール名」が取得されます。実行可能ファイルがそのdylibにリンクされている場合、実行可能ファイルはdylibのインストール名をそのdylibへの参照に格納します。(リンク先のdylibファイルのリンク時パスは保存されないことに注意してください。)実行可能ファイルがロードされると、ダイナミックローダーはデフォルトで記録したインストール名を使用してdylibを検索します。
-install_name <name>
リンカのオプションを使用して、インストール名を指定できます。ライブラリが固定の場所にインストールされると予想される場合は、ライブラリがインストールされると予想される場所(/usr/local/lib/foo.dylibなど)への絶対パスである可能性があります。しかし、多くの場合、それは役に立ちません。ダイナミックローダーがdylibを見つけるためのより柔軟な手段が必要です。
ダイナミックローダーは、このような柔軟性をサポートするために、インストール名の特定の特別なパスプレフィックスを理解します。dyld(1)
manページを参照してください。たとえば、@executable_path/foo.dylib
thenのインストール名を指定すると、ロード時に、ローダーはライブラリの実行可能ファイルの横を検索します。
を使用すると、dylibのインストール名を確認できますotool -D foo.dylib
。dylibにインストール名がない場合があります。その場合、有効なインストール名はパスのないファイル名だけです。
ローダーがインストール名を使用してライブラリーを見つけられない場合、ローダーには検索戦略があります。デフォルトでは、〜/ lib:/ usr / local / lib:/ lib:/ usr / libを検索します。一部の環境変数を使用して、検索戦略を変更できます。たとえばDYLD_FALLBACK_LIBRARY_PATH
、代わりに、検索するディレクトリのコロンで区切られたリストを設定できます。これらの環境変数は、dyld(1)
manページにもリストされています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加