LINUX.ORG.RU

Совпадающие символы в подгружаемой библиотеке


0

0

Добрый вечер. Извините за формулировку вопроса. В общем проблема заключается в том, что в подгружаемой dlopen'ом библиотеке содержатся такие же симвалы, как и в основной программе. В следствие этого библиотека изспользует символы основной программы. Вопрос первый: правильно ди в таком случае ставить statis перед названиями глобальных переменных. Вопрос второй: что делать, если существуют совпадающие имена функций. Заранее спасиба.


[Если я правильно понял]

> В следствие этого библиотека изспользует символы основной программы.

Можно попоробовать есключить из экспортирования нужные символы (--exclude-symbols), хотя они теоретически и не должны экспортироваться. Можно попробовать объявить символы, экспортируемые программой, как WEAK.

> правильно ди в таком случае ставить statis перед названиями глобальных переменных

Если не нужен доступ к переменным извне файла, в котором они объявлены (в т.ч. из программы, загружающей либу) - это всегда надо делать.

Ну и на крайняк: "закат солнца вручную" - делаешь в либе функцию, которая возвращает таблицу указателей на определенные в ней функции.

tailgunner ★★★★★
()

Уточню проблему. Существует функция error(char*,...) котороя выводит сообщение об ошибке и ее описание. В основной проге она просто печатает сообщение на экран и добавляет его в файл журнала. Функция с таким же названием и параметрами присутствует в библиотеке, подгруженной dlopen'ом. Только делать она то, что ей предписано, должна несколько иначе. Если я описываю ее тело в модуле, в котором она вызывается, то все хорошо. Но вот если выношу ее в отдельный модуль, то вызывается не она, а функция, объявленная в основной программе.

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

> Если я описываю ее тело в модуле, в котором она вызывается, то все хорошо.

"Модуль" - это что такое? Си-файл? Куда он влинковывается - в программу или в либу? "Описываю тело" - ты имеешь в виду определение функции?

> Но вот если выношу ее в отдельный модуль, то вызывается не она, а функция, объявленная в основной программе.

Вызывающий модуль - он где находится? В программе или в либе? Нет ли на error, которая в либе, спецификатора static?

Экспортирует ли основная программа символ error - что говорит nm? Импортирует ли либа символ error (тоже nm)?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ладно. Совсем подробно.

Executable program:

Сырсы сего содержат файл message.h, в котором содержится определение функции void error(char*,...). В файле message.c содержится тело этой функции. Далее: в main.c содержится код, который подгружает библиотеку dlopen'ом со вторым параметром равным RTLD_LAZY. Далее dlsym'ом берутся такие символы библиотеки как Open, Close, etc.. и потом используются по назначению.

Dynamic library:

Так же содержит файл message.h и message.c с такимже определением void error(char*,...), но реализация его немного другая. Привызове из main.c функции error вызывается функция из запускаемой программы.

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

[ По-моему, ты путаешь термины "объявление" и "определение". "Определение@"- это заголово + тело, "объявление" - только прототип. ]

Совет тот же - изучи вывод утилиты nm на бинарях программы и библиотеки. Я подозреваю, что твоя программа экспортирует символ error, и библиотека привязывается именно к нему, а не к тому error, что в ней.

Альтернативно - где-то в линковке у тебя напутано, и в библиотеку линкуется тот же message.o, что и в программу 8)

tailgunner ★★★★★
()
Ответ на: комментарий от Nazgul

То есть они оба экспортируются? Тогда попробуй опцию линковщика --exclude-symbols: что-нибудь вроде gcc -Wl,--exclude-symbols,error при линковке основной программы.

tailgunner ★★★★★
()
Ответ на: комментарий от Nazgul

Да, это я ошибся - специфичная для PE опция. Тогда другое предложение - поставить на error в библиотеке атрибут visibility(protected)

void __attribute__ ((visibility ("protected"))) error()

{

}

Если и это не поможет, я сдаюсь :( Вообще-то error не должна экспортироваться из программы :/

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Вот и я о том, что не должна. Ладно, пойду домой - пробовать. Здесь уже поздно. Если еще какие предложения у кого буду - пишите.

Nazgul
() автор топика
Ответ на: комментарий от Nazgul

> Хоть и криво это клнечно, но помогло.

Лучше было бы разобраться, рочему главная программа экспортирует символы.

> Биг пасиба)

You're welcome 8)

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.