Название: Непонятки с dlsym Отправлено: Igors от Ноябрь 16, 2009, 00:34 Добрый вечер
Переношу динамические библиотеки (файлы плагинов) на Linux. Столкнулся с проблемой когда библиотеке нужна ф-ция из главного (исполняемого) файла. Пример Код: // код библиотеки Ладно, тогда пробую так Код: void * hand2exe = dlopen(0, RTLD_LAZY); Код: extern "C" { Может в Линуксе надо указывать имена экспортируемых ф-ций в файле или через #pragma? Странно, по OSX я знаю что все cdecl и все экспортируется если не static. Разве в Линуксе не так? Спасибо Название: Re: Непонятки с dlsym Отправлено: Rcus от Ноябрь 16, 2009, 04:14 А как насчет objdump? И еще кажется опция -rdynamic нужна именно для этого
Название: Re: Непонятки с dlsym Отправлено: igor_bogomolov от Ноябрь 16, 2009, 13:29 Небольшая вырезка из рабочего проекта. Надеюсь поможет :)
Код
Код
Код
Название: Re: Непонятки с dlsym Отправлено: Igors от Ноябрь 16, 2009, 15:30 Добрый день
Вырезка не помогла, я по существу делаю то же - и все получается когда я зову ф-ции библиотеки из исполняемого файла - а наоборот нет А как насчет objdump? И еще кажется опция -rdynamic нужна именно для этого Не вижу за что зацепится с objdump Код: // дамп ф-ции exe afqkf, dlsym НЕ находит Код: // дамп ф-ции библиотеки, dlsym находит -rdynamic эффект имеет - но разрушительный :) Получаю exception смотрю в чем дело. Оказывается, когда я в библиотеке вызвал метод ReadULong() - он вызывается из исполняемого файла, причем как метод ReadULong совершенно другого типа/объекта. Я об этом не просил, а всего лишь слинковал exe с опцией -rdynamic. Нет уж, "такой хоккей нам не нужен" Название: Re: Непонятки с dlsym Отправлено: BRE от Ноябрь 16, 2009, 20:10 Попробуй основную программу линковать с флагом -export-dynamic.
-Wl,-export-dynamic Название: Re: Непонятки с dlsym Отправлено: Igors от Ноябрь 16, 2009, 21:25 Попробуй основную программу линковать с флагом -export-dynamic. Пробую именно это последние 4 часа. Получаю-Wl,-export-dynamic Код: /usr/bin/ld: No such file: No such file or directory Пока не смог понять о КАКОМ файле идет речь. Продолжаю долбить... Название: Re: Непонятки с dlsym Отправлено: Igors от Ноябрь 16, 2009, 22:25 Ага, понял, моя ошибка была
Код: -Wl, -export-dynamic Но эффект тот же что и с -rdynamic. Ищу как экспортировать из exe только то что надо Название: Re: Непонятки с dlsym Отправлено: Rcus от Ноябрь 17, 2009, 04:23 можно еще почитать кусок man gcc /-fvisibility=
Название: Re: Непонятки с dlsym Отправлено: Igors от Ноябрь 17, 2009, 07:02 Доброе утро
В конце концов работает :) Вот что нужно делать чтобы экспортировать только то что желаем: 1) Если экспорт из exe файла, то добавить опцию линкера -Wl,-export-dynamic (замечено что тот же эффект с -rdynamic) 2) Добавить опцию компилятора -fvisibility=hidden 3) Маркировать экспортируемые ф-ции прагмой, например #pragma GCC visibility push(default) ... extern "C" void MakeDir( void ) { ... } ... #pragma GCC visibility pop Примечание: когда библиотека использует экспортируемую ф-цию из exe файла - НЕ НУЖНО делать для нее обертку (с помощью dlsym и.т.п.). Не знаю как но OS сам это резолвит. Например, у меня в библиотеке только описание extern "C" void MakeDir( void ); никакого тела нет. Есть отрицательная сторона: если что-то совпадает (в exe и библиотеке) то OS будет решать а не я. Поэтому экспортировать все-все "чревато неприятными последствиями". Спасибо, BRE, Rcus |