powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции из динамической библитеки в Linux
6 сообщений из 6, страница 1 из 1
Вызов функции из динамической библитеки в Linux
    #33307913
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся со следующей проблемой: Предположим есть исходник с функцией 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
Вызов функции из динамической библитеки в Linux
    #33308287
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
Вызов функции из динамической библитеки в Linux
    #33308407
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема закрыта, разобрался сам
...
Рейтинг: 0 / 0
Вызов функции из динамической библитеки в Linux
    #33308481
1024byte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плз отпишись, чё было то ?
...
Рейтинг: 0 / 0
Вызов функции из динамической библитеки в Linux
    #33308574
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO extern "C"
...
Рейтинг: 0 / 0
Вызов функции из динамической библитеки в Linux
    #33308681
Lego_12239
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции из динамической библитеки в Linux
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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