Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Экспорт из динамических библиотек  (Прочитано 11819 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Deke2
Гость
« : 08-09-2006 13:27 » new

Пользуясь gcc 3.3, пытаюсь создать динамическую библиотеку. Похоже, что эта штука по умолчанию экспортирует все функции, какие только можно. Вопрос: как экспортировать только то, что мне нужно? В Винде я для этого .def файл создавал. А вот как в unix - не знаю.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-09-2006 16:05 » 

Поиск для лохов придуман?

https://club.shelek.ru/viewart.php?id=111

man dlopen

См. второй параметр - управление импортом в подгружаемой библиотеке.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Deke2
Гость
« Ответ #2 : 08-09-2006 19:18 » 

К вопросу о лохах - разве я спрашивал об импорте? Как импортировать то, что мне нужно, я знаю. Проблема в другом. Приведу пример.

Допустим, у меня есть виндовская DLL. Ее исходник содержит 100 функций. Экспортированы только 2. Это значит, что получить информацию об именах можно только для этих двух функций. Об остальных 98 пользователь даже не догадается (без дизассемблирования, а оно не в счет).

В unix, как я понимаю, не так. Программа otool выдает информацию о всех функциях, имеющихся в библиотеке. И даже о классах. Вопрос в том, как этого избежать. Как сделать так, чтобы пользователь видел только то, что ему положено?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 08-09-2006 19:53 » 

Deke2, Могу предположить, не объявлять их в хэдэрэ. Ну и не ставить на них extern "C".
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 08-09-2006 20:10 » 

Deke2, сорри - был невнимателен.

Ты ничего не путаешь? Динамические библиотеки не экспортят сами ничего. Возможно тут у тебя в терминах путаница... В unix приняты следующие термины: static, shared, dynamic - соотв.: статическая, разделяемая, динамическая.

Динамическими в unix называются подгружаемые программно через ф-ию dlopen().

Если ты об обычных разделяемых библиотеках, то не экспортятся static имена - они отсеиваются на этапе компиляции, т.к. видны в пределах модуля. Возможно тебе это поможет.

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Deke2
Гость
« Ответ #5 : 08-09-2006 20:23 » 

Насчет путаницы в терминах - виноват-с. Юниксоид я очень молодой, вот и использовал родную виндовскую терминологию. Речь, безусловно, о разделяемых библиотеках. Насчет static - спасибо, попробую.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 14-06-2007 08:38 » 

Добрый день, Сообщество!

Поднимаю снова эту тему ввиду поступления новых данных.
so на линукс действительно экспортирует почти все символы, а не только те которые были явно указаны(как это делается в windows), но с некоторых пор это так только поумолчанию.

чем это плохо
1. долгая загрузка библиотек
2. наличие эфекта схлопывания символов если в двух подгружаемых библиотеках сопадают декорированные имена символов, что приводит к весьма сложно уловимым ошибкам

в gcc 4.0 и старше и в 3.4 после применения патча
эту ситуацию можно изменить
для запрета экспорта всех символов кроме заданных можно импользовать несколько подходов
1. ключи компиляции -fvisibility=hidden -fvisibility-inlines-hidden
2. прагма #pragma GCC visibility push(hidden)
3. __attribute__ ((visibility("hidden")))

Более подробно можно прочитать тут:
http://gcc.gnu.org/wiki/Visibility
http://readlist.com/lists/gcc.gnu.org/gcc/0/2926.html
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
http://www.nedprod.com/programs/gccvisibility.html
man gcc и там ишим описание ключей

проверял на тестовом приложении загружающим две SO с совпадающими символами
по дефолту были колизии символов так например вторая библиотека использовала переменные не помеченные как static из первой библиотеки
после запрета экспорта этой переменной ошибка пропала

+

вот тут:
http://people.redhat.com/drepper/goodpractice.pdf
есть рекомендации по созданию shared библиотек
« Последнее редактирование: 14-06-2007 08:41 от LogRus » Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines