Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции из динамической библитеки в Linux / 6 сообщений из 6, страница 1 из 1
06.10.2005, 09:46
    #33307913
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из динамической библитеки в Linux
Столкнулся со следующей проблемой: Предположим есть исходник с функцией double func(double) Делаю из него динамическую библитеку командами g++ -fPIC -c func.cpp и затем g++ -shared func.o -o libmy.so. После загрузки библиотеки пытаюсь вызвать в программе *(void **) (&func) = dlsym(handler_library, "func") - возвращается пустой указатель и ошибка "undefined symbol: func". Смотрю программой nm список функции и вижу что моя функция называется _Z6funcd... После этого пытаюсь загрузить функцию с указанным именем и все получается. Насколько я понимаю проблема изменения имени связана с параметрическим полиморфизмом. Как сделать так чтобы компилятор не изменял имена функции.
...
Рейтинг: 0 / 0
06.10.2005, 11:17
    #33308287
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из динамической библитеки в Linux
up
...
Рейтинг: 0 / 0
06.10.2005, 11:42
    #33308407
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из динамической библитеки в Linux
Тема закрыта, разобрался сам
...
Рейтинг: 0 / 0
06.10.2005, 11:59
    #33308481
1024byte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из динамической библитеки в Linux
плз отпишись, чё было то ?
...
Рейтинг: 0 / 0
06.10.2005, 12:20
    #33308574
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из динамической библитеки в Linux
IMHO extern "C"
...
Рейтинг: 0 / 0
06.10.2005, 12:42
    #33308681
Lego_12239
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции из динамической библитеки в Linux
ChameLe0nпараметрическим полиморфизмом
:-)
Если не выпендриваться, то можно просто - перегрузка функций.
ChameLe0nПосле загрузки библиотеки пытаюсь вызвать в программе *(void **) (&func) = dlsym(handler_library, "func")

Может все таки - func = (double (*)(double))dlsym(handler_library, "func").

ChameLe0nКак сделать так чтобы компилятор не изменял имена функции.

Ну это, вообще, финиш.
Дело в том, уважаемый, что одна из фишек Си++ - в перегрузке функций, а достигается она искажением имен, которое включает в себя кодирование передаваемых параметров. Все это для того, чтобы имя функции оставалось уникальным, потому как процессору до СИХ ПОР надо поиметь адрес на исполняемый код, а не читать мысли что вы хотите запустить. Пример перегрузки функций:
void Func(void); // @Func$qv

void Func(int); // @Func$qi

void Func(int, int); // @Func$qii

void Func(*char); // @Func$qpc

void Func(unsigned); // @Func$qui

(кодирование параметров функции зависит от компилятора, но логика у всех примерно такая. Эти примеры взяты из книги по C++Builder, потому как лень было опять перегружаться в Linux, ибо скоро обед :-) )

Так вот, как по Вашему функция dlsym узнает какую функцию именно вы хотите? Голого имени маловато будет.
Ответ на вопрос: что бы компилятор не искажал имена функций, в следствии "параметрического полиморфизма" :-), надо писать библиотеки на Си!

И, вообще, утилитки умные знаете(nm), а вот Си++ так и не изучили.

man УЧЕБНИК_ПО_СИ++ !

Читать надо больше, а не по форумам лазить.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции из динамической библитеки в Linux / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]