|
|
|||||||
Вопросы по динамическим библиотекам10.03.2011, 18:49. Показов 12004. Ответов 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++ Распределение функций по библиотекам Какими библиотекам пользуетесь? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|