如何将C库函数加载到汇编中,以及如何在另一个C或汇编项目中使用汇编库函数

时间:2019-03-21 23:35:27

标签: c macos assembly x86-64 nasm

目前,我正在使用以下方法构建一个foo.hfoo.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

1 个答案:

答案 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)手册页中列出。