Mac: Как экспортировать символы из исполняемого файла? - PullRequest
6 голосов
/ 17 октября 2010

Я пишу исполняемый файл, который использует dlopen () (LoadLibrary () в Windows) для динамической загрузки общей библиотеки. Общая библиотека использует символы из исполняемого файла.

В Windows это возможно. Исполняемые файлы могут экспортировать символы: файлы declspec (dllexport) и .def оба работают. Компоновщик при создании .exe также создает файл .lib («библиотека импорта»), поэтому DLL просто нужно связать с этим .lib.

В Linux это также возможно. Я передаю -Wl, -export_dynamic при сборке исполняемого файла, чтобы он экспортировал свои символы.

Вместо этого в Mac OS X ... -Wl, -export_dynamic не работает, но есть -Wl, -exported_symbols_list, <filename> где <filename> - список символов для экспорта (что-то более простое версия файла .def). Но тогда создание общей библиотеки не так просто: компоновщик жалуется на неразрешенные символы.

Я попробовал взломать: переименовал исполняемый файл в lib <executable> .dylib и, когда связывал разделяемую библиотеку, передал -l <executable>. Но выдает ошибку «не удается связать с основным исполняемым файлом».

Общая проблема заключается в том, что совместно используемые библиотеки Linux могут содержать неразрешенные символы, в то время как Windows и Mac OS X не допускают этого. Но в Windows есть «библиотеки импорта» для разрешения символов по отношению к зависимостям, а в Mac OS X, по-видимому, нет ...

Как это можно решить в Mac OS X? Есть ли эквивалент «библиотеки импорта» (библиотека-заглушка, созданная компоновщиком Windows при создании DLL, поэтому, если какой-либо модуль должен динамически связываться с DLL, он связан с «библиотекой импорта»)? Или другое решение?

Ответы [ 2 ]

5 голосов
/ 18 октября 2010

Автономный интерпретатор Lua поддерживает динамическую загрузку (через dlopen) общих библиотек, которые используют символы из исполняемого файла (Lua API).При его создании не используется специальный флаг ссылки.Общие библиотеки создаются с использованием этого заклинания:

env MACOSX_DEPLOYMENT_TARGET=10.3 gcc -bundle -undefined dynamic_lookup -o random.so lrandom.o
4 голосов
/ 19 октября 2010

Спасибо, ваш ответ стимулировал желание исследовать разницу между пучками и дилибами. И на странице руководства ld упоминается опция с именем -bundle_loader

-bundle_loader исполняемый файл
Это указывает на исполняемый файл, который будет загружать пакет выходной файл связан. Неопределенные символы из пакета проверяются на соответствие указанному исполняемому файлу динамических библиотек, с которыми был связан пакет.

(обратите внимание, что при сборке dylib -bundle_loader не работает, он работает только с пакетами) Так что старая командная строка

cc -shared -o <output>.so <input>.c

было превращено в

cc -bundle -bundle_loader <executable> -o <output>.so <input>.c

и выходной комплект разрешил свои неопределенные символы относительно исполняемого файла.

...