Свежие комментарии

Title Comment
Это не совсем то, dll hell получается не в процессе разработ

Это не совсем то, dll hell получается не в процессе разработки, а в процессе эксплуатации написанного. Когда у тебя чудесным образом меняется поведение программы из-за подмены библиотеки. А то, что есть проблемы в момент разработки это несколько иное. То, что у юзера окружение будет совпадать с тем в котором отлаживал разработчик как-раз залог нормальной работы.

А требовать со всех супер качественного кода в каждой новой версии, чтобы все старое работало с новым без проблем - вот это утопия и залог проблем. Собственно этого как я понял все-таки нет, можно разные версии библиотек и в unix процессах смешивать (натолкнулся на упоминание про это где-то), только вот для стандартной библиотеки видимо решили поступить иначе.

Почему нельзя - понятно даже очень. Это же DLL hell, но не н

Почему нельзя - понятно даже очень. Это же DLL hell, но не на этапе линковки, а на рантайме.

То самое против чего я возмущался - две free() в одном процессе.

Ошибку то пофиксили, а вот программа может работать только с

Ошибку то пофиксили, а вот программа может работать только с ошибочной версией библиотеки. Попросить разработчика поправить это конечно здорово но не всегда возможно.

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

Если в unix есть поддержка версионирования dll в принципе, то чем тогда лучше glibc, почему нельзя несколько версий подгрузить одновременно?

Да, в пределах одного major все нормально, берем старшую вер

Да, в пределах одного major все нормально, берем старшую версию и все.

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

Что касается ошибок, то ну нельзя сказать, что в libc их нет, но в этом мире принято пофиксить ошибку (и вернуть патч разработчику, например), а не обойти.
Принято - не означает, что оно всегда так.

Т.е. если я использую модуль использующий новую версию glibc

Т.е. если я использую модуль использующий новую версию glibc, то буду вынужден тоже ее использовать иначе просто не будет линковаться. Как я понял два разных glibc не могут быть загружены в одном процессе.

Если это делается на уровне линковки и как-то вшито в модуль, то как быть если я пытаюсь пристыковать два чужих модуля каждый из которых был слинкован с какой-то своей версией. Я должен взять самую старшую за основу и как-то переопределить из зависимость, правильно я понимаю?

Принцип - подключай самый новый вариант и все заработает неплох, пока существует только одна библиотека. Есть правда чисто техническая проблема - им надо тщательно воспроизводить свои старые ошибки.

Добавили, естественно. Но если кто-то требует новое, его не

Добавили, естественно.

Но если кто-то требует новое, его нету (и версионирование не сработало, скажем) - то просто не слинкуется.

А за совместимостью ABI должны следить.

Понятно. А с glibc как-бы гарантируют что подобного не произ

Понятно. А с glibc как-бы гарантируют что подобного не произойдет. Т.е. они туда ни одной новой функции не добавили и все тотально взаимозаменяемо?

Тут надо отделить. Версионность четко отрабатывает, каждому

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

Иногда полезно разкрыть граф зависимостей и просмотреть кто кого тянет. В windows - это утилита depends или dumbbin с консоли. Кстати если чего не хватает depends покажет.

Судя по размеру winsxs у тебя многое из этого нужно, у меня

Судя по размеру winsxs у тебя многое из этого нужно, у меня то меньше почти в два раза. Наверное при деинсталляции оттуда может что-то убираться.

Вопрос был бы своевременным, если бы альтернативные библиоте

Вопрос был бы своевременным, если бы альтернативные библиотеки действительно были бы. Я гуглением нашел только упоминания glibc для солярки (и то, это скорее пожелания, чем что-то еще).

Но если возникнут - они вынужденно будут совместимы по ABI, иначе пользоваться никто не будет (а одному автору такой проект не потянуть).

Т.е. вся альтернативность сейчас - это glibc 2.6 против версии 2.2

Тут я могу точно сообщить - версия crt менялась с выпуском v

Тут я могу точно сообщить - версия crt менялась с выпуском vs2005 sp1, название файла не менялось и с выпуском vs2008 sp1. Название меняется при смене версии vs, они прибавляют 1. Если нет такой библиотеки, то _ничего_ работать не будет, манифест внедренный в dll/exe четко это оговаривает. Дебажные версии поставляются всегда отличаются - там даже название файла другое (d в конце). Т.е. все жестко - имя и версия должны совпадать. Насчет многопоточности не помню, там вроде mt в названии есть.

Многопоточность - это еще одна сторона одной проблемы - согл

Многопоточность - это еще одна сторона одной проблемы - согласование разных версий. В .net для этого есть атрибуты которые помечают реентерабелен ли метод или класс, т.е. наверное уже компилятор что-то может диагностировать, аналогично наверное с системными библиотеками в .net. А если говорить про однопоточную версию crt, то сейчас ей я думаю уже мало кто пользуется, падение производительности совсем небольшое, поэтому лучше не мудрить.

Жалко будет. Потому что Linux совсем опопсел. А BSD я не лю

Жалко будет. Потому что Linux совсем опопсел. А BSD я не люблю почему-то.

Хорошо, версионирование есть (пусть и между major версиями),

Хорошо, версионирование есть (пусть и между major версиями), теперь вопрос почему не может быть двух версий в пределах одного процесса, как быть если один модуль хочет одну версию, а другой другую?

Все-же мне не очень понятна например такая ситуация. Один пр

Все-же мне не очень понятна например такая ситуация. Один проект использует glibc, а другой например dietlibc, как они будут уживаться? Если предположить что есть системный сервис управления памятью, то допустим все через него работают, а как быть с FILE*, где гарантия что автор одной библиотеки не изменит эту структуру под себя. Опять-же есть ли там debug/release различия для одной и той же библиотеки?

Ну уж обновление рантайма от Microsoft сама Microsoft могла

Ну уж обновление рантайма от Microsoft сама Microsoft могла бы и класть, тоже мне проблема.

С 7-гигабайтным (у меня) winxs я понял что меня раздражает - нет способа узнать, что из 20 версий примерно одного и того же - 15 уже не нужны никому.

А я вот не уверен, кстати. Если такие есть (не считая, скаж

А я вот не уверен, кстати.

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

И с выкрутасами от Оракла - имеет шанс умереть молодым, без

И с выкрутасами от Оракла - имеет шанс умереть молодым, без 64-битного time_t.

Ну да, естественно, есть много разницы. Но у вас приложение

Ну да, естественно, есть много разницы.

Но у вас приложение - или однопоточное или много. Если оно много, а где-то внутри какого-то DLL завется однопоточный - это тоже превед приключениям

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

С отладкой - да, теоретически приятно иметь отладочный аллокатор только для своего кода, а скажем для системного - не иметь. Но готов этим пожертвовать.

В солярке, что характерно, как в 8-ке была libc.so.1, так и

В солярке, что характерно, как в 8-ке была libc.so.1, так и в десятке libc.so.1.

Согласен удобно, но вот crt в windows меняется с версией vis

Согласен удобно, но вот crt в windows меняется с версией visual studio или vs service pack, кто-то должен положить это обновление в систему. А потом как я понял есть альтернативные crt для unix и он уж наверняка идут просто в комплекте с софтом.

>Просто механизм динамической линковки другой - тот же free(

>Просто механизм динамической линковки другой - тот же free() в рамках процесса будет один

Ну вот тут видимо принципиальная разница с windows - там аллокаторы в crt разные, дебажная версия имеет другой заголовок блока и вообще работает несколько иначе. Потом существует многопоточная и однопоточная реализациия аллокатора, многопоточный чуть медленнее работает, там критические секции есть.

Я солярку лет 10 уже не встречал, но и там должно бы быть, к

Я солярку лет 10 уже не встречал, но и там должно бы быть, как без него.

В Linux и FreeBSD - есть. В Макоси - судя по номерам версии в именах библиотек - тоже есть.

Но если я правильно помню, версионирование ELF-библиотек идет по major версии (в soname нету minor), т.е. если апгрейд был c сохранением major, то даже если старую версию не снести, ее считай что и нету, динамический линковщик не найдет.
Это к Linux/FreeBSD относится, в макоси может быть все вообще не так.

Понятно, но значит все-таки связывание идет с конкретной реа

Понятно, но значит все-таки связывание идет с конкретной реализацией.

Ну вот у меня то с чего мой вопль начался - собралося ведь.

Ну вот у меня то с чего мой вопль начался - собралося ведь. Взяло и собралось. И из десятка примеров не работал только один.

А этого не должно было бы вовсе быть, должно было где-то заругаться.

Понимаете, практика на Unix-системах, уж всяко в смысле CRT

Понимаете, практика на Unix-системах, уж всяко в смысле CRT не менее развесистых, очень простая: берешь варез в бинарниках, никакой libc/CRT в поставке нет - и он работает.
Систему поапгрейдишь, часто со сменой версии системы (и libc тоже) - и все тоже работает.
Сюрпризы - да бывают. Но они редкие и не считаются нормальными.

alex пишет, что в unix есть версионирование DLL/.SO, поэтому

alex пишет, что в unix есть версионирование DLL/.SO, поэтому вполне возможно, что версии то разные реально работают, либо они осознанно остались на старой.

Если FILE* вернет, то нельзя - это объект CRT, т.е. он управ

Если FILE* вернет, то нельзя - это объект CRT, т.е. он управляется библиотекой. Если системный handle - то можно, хэндлы иногда можно и между процессами передавать.

В windows winsxs тоже дает возможность оверрайдить версии, н

В windows winsxs тоже дает возможность оверрайдить версии, но это конечно может плохо кончиться.

Если интерфейс простой и фиксированный, то действительно его

Если интерфейс простой и фиксированный, то действительно его можно не менять. Например как API самой системы, хотя и там бывают проблемы. Если же есть какое-то изменение, то ошибки и особенности неизбежны, писать без ошибок пока никто не научился.

С crt ситуация такова, то к сожалению это не только стандартная библиотека C. Наверное часть его можно и заморозить, но это видимо и делать неудобно и возможно не решило бы проблему, т.к. используются не только стандартные функции, вот цитирую wikipeda:

http://ru.wikipedia.org/wiki/Libc

>Стандартная библиотека языка Си только регламентирует наличие >вышеупомянутых подпрограмм и их поведение. Так как реализация >компилятора может зависеть от наличия этих дополнительных >функций, то все зависит от того, какие подпрограммы собраны в >Стандартную библиотеку языка Си, таким образом любая программа, >разработанная с их помощью, будет нуждаться в них.

>Хотя часто путают их со Стандартной библиотекой языка Си из-за их >комплектации, библиотека CRT не является стандартизированной >частью языка и зависит от особенностей поставки программного >продукта.

С MS-DOS скорее всего старались написанное не трогать, только добавлять новое. В win32 уже не все так просто, ядро они дорабатывали и что-то все-же менялось, находили баги, для совместимости со старым у них есть хитрая подсистема которая имитирует ошибочное или считающиеся нестандартным поведение для многих старых программ.

Pages

Subscribe to comments_recent_new