|
|
|||||||
Вопросы по динамическим библиотекам10.03.2011, 18:49. Показов 12049. Ответов 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++ Распределение функций по библиотекам Какими библиотекам пользуетесь? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|