目前,我正在使用以下方法构建一个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
答案 0 :(得分:2)
您要指定-static
,这意味着:
-static Produces a mach-o file that does not use the dyld. Only used building the kernel.
dyld
是动态加载程序。如果您不使用动态加载程序,则不能使用动态库。
已编辑问题的更新:
创建dylib时,它会得到一个“安装名称”。当可执行文件链接到该dylib时,该可执行文件将dylib的安装名称存储在对其的引用中。 (请注意,它不会不存储与其链接的dylib文件的链接时路径。)加载可执行文件时,动态加载程序默认使用其记录的安装名称查找dylib。
您可以使用链接器的-install_name <name>
选项指定安装名称。如果您希望将库安装在固定位置,则它可能是您希望将库安装到的绝对路径(例如/usr/local/lib/foo.dylib)。但是,通常这没有用。您想要动态加载程序找到dylib的更灵活的方法。
动态加载程序了解安装名称上的某些特殊路径前缀,以支持这种灵活性。请参见dyld(1)
手册页。例如,如果您指定安装名称为@executable_path/foo.dylib
,则在加载时,加载器将在该库的可执行文件旁边查找。
您可以使用otool -D foo.dylib
查看dylib的安装名称。 dylib可能没有安装名称,在这种情况下,其有效安装名称就是没有路径的文件名。
如果加载器没有通过使用其安装名称找到该库,则它具有搜索策略。默认情况下,它位于〜/ lib:/ usr / local / lib:/ lib:/ usr / lib中。您可以使用一些环境变量来更改搜索策略。例如,您可以将DYLD_FALLBACK_LIBRARY_PATH
设置为要搜索的用冒号分隔的目录列表。这些环境变量也在dyld(1)
手册页中列出。