Как загрузить функции библиотеки C в сборку и использовать функции библиотеки сборки в другом проекте C или сборки - PullRequest
2 голосов
/ 22 марта 2019

В настоящее время я строю 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

1 Ответ

2 голосов
/ 22 марта 2019

Вы указываете -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, то во время загрузки загрузчик будет искать рядом с исполняемым файлом библиотеки.

Вы можете увидеть имя установки dylib с помощью otool -D foo.dylib.У вашего dylib может не быть имени для установки, и в этом случае его эффективное имя для установки - это просто имя файла без пути.

Если загрузчик не находит библиотеку по имени установки, он выполняет поискстратегия.По умолчанию это выглядит в ~ / lib: / usr / local / lib: / lib: / usr / lib.Вы можете использовать некоторые переменные среды, чтобы изменить стратегию поиска.Например, вы можете установить DYLD_FALLBACK_LIBRARY_PATH в список каталогов, разделенных двоеточиями, для поиска.Эти переменные среды также перечислены на справочной странице dyld(1).

...