|
|
|||||||
Вопросы по динамическим библиотекам10.03.2011, 18:49. Показов 12109. Ответов 22
Метки нет (Все метки)
0
|
|||||||
| 10.03.2011, 18:49 | |
|
Ответы с готовыми решениями:
22
Литература по библиотекам Путь к библиотекам Документация к библиотекам |
|
|
||
| 10.03.2011, 18:59 | ||
|
и какое влияние на это оказывают флаги RTLD_GLOBAL и RTLD_LOCAL ?
0
|
||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 10.03.2011, 19:02 | |
|
0
|
|
|
|
|||
| 10.03.2011, 19:09 | |||
|
Evg, в этом мане, в главе 3.4, написано такое:
Добавлено через 2 минуты
0
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 10.03.2011, 19:14 | ||
|
Там речь не о ограничениях на размер кода, а об аппаратных платформах (в основном антикварных) где PIC не возможен
0
|
||
|
|
|||
| 10.03.2011, 19:15 [ТС] | |||
|
Разделяемым является только код (исполняемые фрагменты) и read-only данные (последнее зависит от компилятора). Read-write данные, понятное дело, в каждом процессе имеют свою копию. Любая среднестатистическая библиотека содержит глобальных данных на порядки меньше, чем кода, а потому за счёт дублирования данных потери памяти не такие уж и большие. Когда ты генерируешь код через -fPIC, то все обращения к глобальным переменным строятся по косвенности. Грубо говоря, в каждом процессе в начале процедуры формируется некое значение, а все обращения к глобальным переменным делаются косвенными - через специальную табличку (которая является данными), в которой прописаны адреса всех глобальных переменных. Такой подход обеспечивает то, что код (исполняемые фрагменты) не содержат настройки на абсолютные адреса, а потому может свободно разделяться между процессами (ибо везде он побайтно совпадает). А если *.so собирать из модулей, собранных без -fPIC'а, то в таком коде будут настройки на абсолютные адреса (которые в разных процессах могут не совпадать) и потому такой код нельзя сделать разделяемым
1
|
|||
|
|
|
| 10.03.2011, 22:25 | |
|
Добавлено через 3 часа 7 минут
Evg, скажи, а компилятор/линкер в .so файле не сохраняют версию компилятора/линкера/libc/libstdc++, которые использовались для линковки этой so`шки ? каким-то образом эту информацию можно получить? или только предварительно сохранив?
0
|
|
|
|
||||||||||||||||||||||
| 11.03.2011, 09:16 [ТС] | ||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Версия компилятора и линкера никак не должна отражаться в бинарнике. Но компилятор может в коде создавать специфическую метку. gcc-2.95, например, в каждом объектнике создавал метку с именем что-то типа ".gcc2_compiled". Более поздние версии gcc при генерации ассемблерного файла пишут строку что-то типа ".ident gcc: <версия>", а куда оно попадает дальше в объектном файле - с ходу не знаю. Наверняка и у линкера есть подобные подпольные приблуды. Но все они носят чисто отладочный характер - т.е. чтобы глазками на них посмотреть и не должны ни к чему обязывать. Хотя где-то в коде линкера под какую-то архитектуру я видел затычки, что при наличии метки ".gcc2_compiled" линкер понимал, что код сгенерил gcc и обходил какую-то ошибку компилятора.
Касаемо версии динамической библиотеки тут немного сложнее. В стандарте elf в заголовке секции можно вклеить так называемые dynamic tags - какие-то вопсомогательные фичи, которые используются при динамической загрузке файла (*.so или исполняемого). Часть этих тэгов является стандартной (т.е. их поведение в спецификации elf'а записано), а часть - implementation defined.
Если посмотреть, какие из файлов присутсвуют в файловой системе (в каталогах /lib и /usr/lib), то можно увидеть 3 файла для glibc. В моём случае имеются:
Для чего нужна такая наносистема. Допустим, на машине установили более позднюю версию glibc, принципиально отличающуюся интерфейсами (и, стало быть, имеющие бинарную НЕсовместимость со старой glibc). При таком раскладе все свежескомпилированные программы должны настраиваться на новую версию glibc, однако старые бинарники должны работать со старой версией glibc, потому как с новой они не смогут работать. В этом случае файлы будут такими (новые и изменённые помечаю звёздочкой):
При таком объяснении на первый взгляд кажется, что схема из трёх файлов избыточная и достаточно двух. Т.е. казалось бы, что вполне достаточно иметь файлы (а не ссылки) libc.so.6 и libc.so.7. Но на самом деле эти указанные файлы олицетворяют собой версию интерфейса (а не библиотеки). Т.е. может выйти библиотека libc-2.11.5.so (т.е. изменение минорной цифры версии) или libc-2.13.1.so (изменение второй цифры версии, но при этом коды остаются бинарно совместимыми). В этом случае копируется файл libc-2.13.1.so и перенастраивается существующая ссылка libc.so.6, после чего старые программы начинают работать с новой библиотекой (потому что новая бинарно совместима со старой), а не со старой, как в предыдущем примере Добавлено через 7 минут Реальное убыстрение ты заметишь только тогда, когда есть обращение к глобальной переменной в цикле с большим количеством итераций. А при "обычном" доступе к глобалу вне цикла этого не почувствовать: т.е. ускорение в 2 такта для кода длиной в 10000 тактов - это экономия на спичках. Лучше пользуйся -fPIC'ом - меньше проблем будет
4
|
||||||||||||||||||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 11.03.2011, 10:42 | ||
|
Evg, Спасибо, подробно и интересно.
Из прочитанного мной когда-то описания ELF-формата это не очевидно, но если это так, то зачем такой дубль? И еще я бы все таки добавил, что возможность слинковать программу с конкретной версией библиотеки есть. В смысле DT_SONAME вполне может содержать и полную версию, или как вариант есть возможность подсунуть библиотеку не из /usr/lib через DT_RPATH (ключик rpath у линкера)
0
|
||
|
|
|||
| 11.03.2011, 13:18 [ТС] | |||
|
1
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||||||||
| 11.03.2011, 14:33 | |||||||||
Это не совсем линукс но вполне честный ELF:
Система (это netbsd) при этом умеет ругаться на не ту версию .so. Если я вас не так понял, то поясните пожалуйста подробнее, ну или ссылку (предпочтительнее) на первоисточник инфы. Добавлено через 25 минут Совмещать, что-то с чем-то и не надо, а вот возможность линковать с конкретной версией бывает нужна.
0
|
|||||||||
|
|
|||||||||||||||
| 11.03.2011, 14:56 [ТС] | |||||||||||||||
|
Как правило более поздня библиотека имеет более широкий набор интерфейсов, но бинарно совместим с более ранней библиотекой. В этом случае у них одинаковый SONAME. И типичный случай - это когда прямая совместимость (от ранней версии к поздней) есть, а обратной (от поздней версии к ранней) - нет. При таком раскладе можно бинарник скомпилировать с более поздней версией библиотеки, а потом попробовать запустить с более ранней. Такие случаи рулятся немного по другому - версии приклеиваются ещё и к меткам (именам функций или переменных). Выглядит оно типа того:
Добавлено через 36 секунд
1
|
|||||||||||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||
| 11.03.2011, 15:19 | |||
|
Честно говоря, вы меня совсем запутали...
Выше в посте 22 вы пишете:
Т.е. NEEDED без SONAME возможно и работает. А наоборот SONAME без NEEDED возможно? опус про совместимость чего-то с чем-то поскипан
0
|
|||
|
|
|
| 11.03.2011, 16:41 [ТС] | |
|
NEEDED в момент загрузки говорит о том, какие библиотеки нужны (ибо как по другому понять, что требуется, к примеру libm.so). Список этих NEEDED формируется в момент линковки (линкеру явно задаются все библиотеки, с которыми вдальнейшем на исполнении должна линковаться программа). В качестве этих NEEDED пишется то, что записано в SONAME подаваемой библиотеки. Если SONAME нет, то прописывается имя файла подаваемой библиотеки
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 11.03.2011, 16:58 | ||
А каким ключиком линкера задать желаемый SONAME при линковке свой .so'шки? UP: сам нашел -soname как ни странно)
0
|
||
|
|
||
| 11.03.2011, 17:14 [ТС] | ||
|
0
|
||
|
|
|
| 12.03.2011, 14:10 | |
|
такой мануальчик нарыл: http://www.akkadia.org/drepper/dsohowto.pdf
очень много инфы по созданию .so
1
|
|
|
|
|
| 12.03.2011, 14:46 [ТС] | |
|
Уж очень специфичный документ. Начинающий его не осилит. Это скорее техническая спецификация, чем мануал по созданию динамических объектов
0
|
|
| 12.03.2011, 14:46 | |
|
Помогаю со студенческими работами здесь
20
Вопрос по библиотекам Interop Справочник по стандартным библиотекам c++ Распределение функций по библиотекам Какими библиотекам пользуетесь? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|