URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7007
[ Назад ]

Исходное сообщение
"Линковка разделяемых библиотек"

Отправлено oaealex , 07-Дек-07 12:16 
Есть разделяемая библиотека - .so модуль.
Все с ним хорошо - загружается, функции вызываются.
Один прикол - Во время компиляции библиотеки не все необходимы модули прилинкованы - указаны в маке файле. Компиляция происходит успешно, а то, что есть неразрешенные ссылки мы узнаем только тогда, когда делается dlopen.
Что, в Линухе - разделяемая библиотека может пользоваться классами в основном модуле и ругачка происходит - только когда "на лету" этого нельзя сделать ?
Если это не так - то почему компилятор не "ругается" во время линковки so модуля ?
По идее, даже если указана опция -fPIC - линковщик должен был об этом сказать.
А то получается - об неразрешенных связях я не знаю до самого момента згрузки.


компиляция .so модуля
с++ -с main.cpp -o main.o -fPIC

линковка .so модуля
с++ main.o -o main.so -fPIC -shared


Содержание

Сообщения в этом обсуждении
"Линковка разделяемых библиотек"
Отправлено jd , 08-Дек-07 06:32 
>Компиляция происходит успешно, а то, что
>есть неразрешенные ссылки мы узнаем только тогда, когда делается dlopen.

А как, по вашему, компилятор узнает во время линковки, с какими аргументами будет вызвана функция dlopen? Есть разница: прилинковать библиотеку или открыть её (dlopen) во время выполнения. dlopen нужна в тех случаях, когда на этапе линковки неизвестно, какая библиотека будет использоваться. Наглядный пример - плагины, которых может быть произвольное количество. А может и вовсе не быть.


"Линковка разделяемых библиотек"
Отправлено oaealex , 10-Дек-07 08:02 
>>Компиляция происходит успешно, а то, что
>>есть неразрешенные ссылки мы узнаем только тогда, когда делается dlopen.
>
>А как, по вашему, компилятор узнает во время линковки, с какими аргументами
>будет вызвана функция dlopen? Есть разница: прилинковать библиотеку или открыть её
>(dlopen) во время выполнения. dlopen нужна в тех случаях, когда на
>этапе линковки неизвестно, какая библиотека будет использоваться. Наглядный пример - плагины,

Вот про них - про плагины - и речь.  И dlopen - такой как в мане с именем библиотеки.
Но дело не в dlopen- он то как раз делает свою работу и делает ее хорошо.

Напрягает то, что линковщиком библиотеки не контролируется наличие неопределенных ссылок. Былобы конечно "круто"  в данном случае, чтобы сам dlopen находил эти ссылки в модуле основной программы - только слабо представляю себе как это будет выглядеть физически
Но можно успокоиться - этого не происходит.
Поэтому и непонятка - почему линковщик вдруг делает за меня предположения - что те функции которые я использую - чудесным образом найдутся в момент dlopen ???.

Ведь когда делается ИСПОЛНЯЕМЫЙ модуль - он с этой задачей справлятся замечательно.



"Линковка разделяемых библиотек"
Отправлено DeadMustdie , 09-Дек-07 15:58 
Це видно человека с опытом разработки под Win32.
Идеология работы с разделяемыми библиотеками под UNIX другая. Действительно, часть символов может быть недоступна на этапе линковки и предоставляться уже при загрузке библиотеки в основную программу.

"Линковка разделяемых библиотек"
Отправлено oaealex , 10-Дек-07 08:06 
>Це видно человека с опытом разработки под Win32.

Угу :) Простите пожалуста :)
>Идеология работы с разделяемыми библиотеками под UNIX другая. Действительно, часть символов может
>быть недоступна на этапе линковки и предоставляться уже при загрузке библиотеки
>в основную программу.

Во веселуха - узнать что ты чтото не прилинковал в плагин -
на этапе работы приложения. Тут такого можно огрести - мало не покажется.
Поэтому и есть подозрение что данный вопрос должен быть красиво решен
на этапе линковки. Только неизвестно - а как ?.


"Линковка разделяемых библиотек"
Отправлено phpcoder , 11-Дек-07 11:38 
[...]
>Поэтому и есть подозрение что данный вопрос должен быть красиво решен
>на этапе линковки. Только неизвестно - а как ?.

Попробую предположить: ldd --as-needed ?


"Линковка разделяемых библиотек"
Отправлено oaealex , 11-Дек-07 12:37 

>Попробую предположить: ldd --as-needed ?

Нет такого ключа в опциях. Да и нужно сообщение "при линковке" от gcc .