DLL: использование символов, которые находятся в коде загружаемой программы
От: cheqa  
Дата: 21.03.13 06:54
Оценка:
Здравствуйте.

Возникла такая вот задача (точнее, незадача).

Есть программа, состоящая из статически слинкованных (в разном порядке, в зависимости от настроек) статических же библиотек-компонент и функции main.
Программа должна уметь подгружать DLL на лету ну и так далее.
Прелесть в том, что ДЛЛи должны использовать код, который лежит в программе, состоящей из статически слинкованных компонент (предвосхищая вопрос — да, действительно лежит, я проверял).
Я ожидал, что оно заработает из коробки — но по факту получилось не так:

"Cannot load library /path/to/plugin/libplugin.so: (...plugin.so: undefined symbol: _ZN5app4namespace10AppClass12staticFunctionElPKcS3_S3_)"

т.е. при включении в ДЛЛ кода, который вызывает функции, которые физически должны распологаться в программе, загружающей ДЛЛ — появляется такое вот сообщение при загрузке.

Немного технических деталей:


Собственно, вопрос такой: как заставить всё это работать, крайне желательно — по описанной выше схеме?

Спасибо.
Re: DLL: использование символов, которые находятся в коде загружаемой программы
От: uzhas Ниоткуда  
Дата: 21.03.13 07:34
Оценка: 2 (1)
Здравствуйте, cheqa, Вы писали:

C>Собственно, вопрос такой: как заставить всё это работать, крайне желательно — по описанной выше схеме?


предположу, что проблема в visibility ненайденного символа
ссылка по теме: http://stackoverflow.com/questions/1500689/dynamic-linking-woes-using-c
цитата:

You need to use the linker option "export-dynamic" when compiling your main executable.

Normally, the main executable won't export its symbols for use by the dynamic linker (unless the symbol is used by some shared library participating in the link), which means that if your library calls back into the main exe, it will fail to load.

Re[2]: DLL: использование символов, которые находятся в коде загружаемой програм
От: cheqa  
Дата: 21.03.13 08:19
Оценка:
Здравствуйте, uzhas, Вы писали:

U>предположу, что проблема в visibility ненайденного символа

U>ссылка по теме: http://stackoverflow.com/questions/1500689/dynamic-linking-woes-using-c
U>цитата:
U>

U>You need to use the linker option "export-dynamic" when compiling your main executable.

U>Normally, the main executable won't export its symbols for use by the dynamic linker (unless the symbol is used by some shared library participating in the link), which means that if your library calls back into the main exe, it will fail to load.


Спасибо за совет. Но, если я всё сделал правильно — не работает. Хотя странно...
Re[3]: DLL: использование символов, которые находятся в коде загружаемой програм
От: uzhas Ниоткуда  
Дата: 21.03.13 08:42
Оценка: 1 (1)
Здравствуйте, cheqa, Вы писали:

C>Спасибо за совет. Но, если я всё сделал правильно — не работает. Хотя странно...


можно еще проверить флаги у dlopen
http://stackoverflow.com/questions/3004318/dynamic-loaded-libraries-and-shared-global-symbols
Re[4]: DLL: использование символов, которые находятся в коде загружаемой програм
От: cheqa  
Дата: 21.03.13 10:46
Оценка:
Здравствуйте, uzhas, Вы писали:

U>можно еще проверить флаги у dlopen

U>http://stackoverflow.com/questions/3004318/dynamic-loaded-libraries-and-shared-global-symbols

Мне почему-то кажется, что ваш совет правильный — но у меня пока не получается. Возможно, виной тому cmake & qt. Надо будет попробовать собрать из командной строки.
А при компиляции объектников никаких особых флагов не надо выставлять?
Re[4]: DLL: использование символов, которые находятся в коде загружаемой програм
От: cheqa  
Дата: 21.03.13 11:33
Оценка:
Здравствуйте, uzhas, Вы писали:

U>можно еще проверить флаги у dlopen

U>http://stackoverflow.com/questions/3004318/dynamic-loaded-libraries-and-shared-global-symbols

В общем, пока не понятно.
Переделал всё на динамическую линковку — теперь обычные символы находятся, ругается, что не может найти staticMetaObject объектов Qt из неродного адресного пространства. Это грустно, да.
При статической сборке — ошибка та же самая, не может найти символы.
Наверное, придётся просто смириться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.