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

标签 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

我想在 assembly 项目中使用这个库。

$ 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 "myassemble.h" 或类似的东西,所以感觉就像一个真正的库。然后你就有了一个像 myfunc 这样的函数,它是在汇编中定义的,但你可以在 c 中将它用作 myfunc(1, 2, 3); 之类的东西。 p>

如果我使用 -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 .

您可以使用 -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) 中手册页。

关于c - 如何将 C 库函数加载到汇编中,并在另一个 C 或汇编项目中使用汇编库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55290777/

相关文章:

c - 此代码是否 ungetch() '\n' ?

C 的格式说明符

android - Mac Eclipse 不解析 NDK 中的 C++ lib 函数

c - 扩展内联汇编 gcc - 计算二次公式的根

c - 如何使用convertTo增强对比度?

c - 试图从 "the art of exploitation"理解示例 char_array2.c

objective-c - 检索用于在应用程序中打开文档的 Spotlight 查询

macos - 无法在 Mac 上找到使用 pip 安装的 Ansible

c - 堆栈帧在我的函数中是什么样子的?

assembly - 映射内存和 SSE