wizzard: (Default)
[personal profile] wizzard

binary versions of win-psycopg2 are built against latest DEBUG version of MSVCRT that ships ONLY with VS2005 SP1 ATL Security Update 2

and they don’t have sources readily buildable on Windows, either – only the Linux ones :\

Date: 2009-09-09 10:35 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
за компиляцию с дебаг-црт надо руки отрывать, педерасты они, вот кто.. а потом некоторые говорят, дескать, microsoft brain slugs надо у людей вырезать.. причем тут майкрософт если у людей руки кривые? Почему в юниксе никто не создает своих папок в /, а в винде у юникс-педерастов опенсорсных это в порядке вещей? ну и т д.. извини, наболело

Date: 2009-09-09 10:47 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
кстати, такая црт у меня должна быть

Date: 2009-09-10 01:35 am (UTC)
From: [identity profile] nponeccop.livejournal.com
Ну, в принципе почему создают - понятно. Потому, что пути с пробелами по историческим причинам всем лень эскейпить, но на юниксах этот не эскейпящий пробелов софт чудом работает, ибо имена всех папок "однобуквенные". А в винде, извините, "Program Files", "Documents and Settings" и (внимание!) "Program Files (x86)". Последнее - это 32-битные program files на 64-битных системах, на скобочках в нём ломается некоторый софт, хавающий простые Program Files.

Ну и так далее - о пермишенах и использовании штатного менеджера пакетов для дистрибьюции я вообще молчу.

Date: 2009-09-10 01:16 am (UTC)
From: [identity profile] nponeccop.livejournal.com
Я как-то день целый мучался.. Ужасно, что dependency viewer не показывает версии, и вообще как-то плохо работает на 64-битной системе. Свистните, если найдете что-то интересное для борьбы с SxS. У меня есть mpich2.dll скомпилированная со старой версией msvcrt и приложение, с ней линкующееся, скомпилированное с новой. И вот на всех узлах кластера работает, хотя не должно. Потому что там стоит антивирус AVG, который подлым образом ставит какую-то версию MSVCRT в виде shared assembly. А на одном не работает, т.к. есть только моя честно таскаемая за собой private assembly.

Date: 2009-09-10 03:59 am (UTC)
From: [identity profile] kunaifusu.livejournal.com
За компиляцию с любой црт в виде длл нужно рвать.

Date: 2009-09-10 05:34 am (UTC)
From: [identity profile] nponeccop.livejournal.com
использование динамических библиотек - нормальное явление. Представьте, скажем, что у Миранды каждый плагин содержал бы внутри копию CRT.

Использование статической CRT делает использование ДЛЛ крайне ограниченным.

Нормальным явлением я считаю статическую компоновку для небольших утилит. Всё остальное должно таскать c собой в msi merge-модуль для CRT, а бинарные "не устанавливающихся" дистрибутивы должны содержать CRT в виде private assembly.

Решение той же Миранды с компоновкой со старой "стандартной" MSVCRT тоже не самое лучшее.

Date: 2009-09-10 06:01 am (UTC)
From: [identity profile] kunaifusu.livejournal.com
При статической линковке остаются только используемые функции, я сильно сомневаюсь, что у Миранды каждый плагин использует все функции CRT. Проблем с динамической линковкой куча, со статической - только религиозные. Но если религия не позволяет статически линковать функции, то тогда по той же религии нельзя использовать темплейтные библиотеки вроде stl или boost.

Date: 2009-09-10 05:11 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Вы недальновидно предлагаете ради выигрыша в полмегабайта (именно столько занимает запакованная последняя CRT, распакованная - 1.4 метра) пожертвовать переносимостью и положиться на undefined behaviour.

Проблемы со статической компоновкой именно CRT заключаются в том, что:

- она (CRT) реализует кучу
- она реализует исключения

Как именно она делает - стандарт не оговаривает. Скажем, она может использовать GetProcessHeap(), HeapCreate() или же реализовать кучу самостоятельно.

И вот если CRT реализовывает кучу скажем, через CreateHeap(), то ей нужно этот хендл где-то хранить, и он понятно у каждого инстанса CRT получается разный. И в результате память, выделенная malloc() в одной длл, невозможно _переносимо_ освободить в другой ДЛЛ.

То же самое и с бросанием исключений через границы DLL, и так далее.

Шаблонные библиотеки либо написаны так, чтобы не использовать глобальные данные, либо полагаются на наличие лишь одной копии этих глобальных данных путём всё того же механизма DLL. Та же STL полагается для этого на свою DLL. А то что функции в нескольких копиях (чего не избежать при специализации шаблона, используемого внутри ДЛЛ) - так это не страшно, код не меняется в ходе выполнения и поэтому все инстансы одинаковые и проблем нет.

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

Скажем, сделают в системе новый файловый АПИ, и получится что fopen и fread внутри для ускорения будут использовать некие глобальные таблицы - и всё, нельзя будет и FILE * передавать между ДЛЛ.

И крики начнутся - дескать, какая Майкрософт плохая, ломает на ровном месте такие незыблемые вещи, как CRT.

Прецеденты уже есть - возьмите ту же безопасность. Система с самого начала (NT 3) была формально многопользовательской с разделением доступа, а де факто - однопользовательской с одним суперпользователем. Так понаписали же софта, пишущего куда не попадя, по принципу "работает ну и хуй с ним - зачем нам читать какие-то религиозные бумажки о том где хранить настройки и пользовательские данные".

А потом бац - развился интернет, а в месте с ним и черви, и сразу же необходимость работы под нерутом. А хуй там - проклятые вендоры понаписывали софта, который упорно и в 2009 году продолжает считать, что в системе ровно один пользователь, притом с административными привилегиями - тот, под которым ставился софт. И снова начались крики о том, какой майкрософт плохой - сделал нам UAC, чтобы софт, написанный через зад, меньше вредил грамотно написанному софту.

Причем у этих писателей говнософта, ругающих Майкрософт, двойные стандарты - я уже вижу аргументы, что дескать система была плохой. Так сами же эти критики пишут сознательно на работе пишут из рук вон плохой софт, признают это. А на вопрос "вы делаете плохой софт, почему ты не уйдешь в другое место, чтобы не участвовать в этом?" отвечают "не бывает оптимальных решений сложных задач" и пускают другие подобные отмазки. И при этом требуют чтобы майкрософт играл по другим правилам.

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

Date: 2009-09-10 06:29 pm (UTC)
From: [identity profile] kunaifusu.livejournal.com
Не путайте undefined behavior, который есть свойство языка и глюки API. Передавать память выделеную в одной DLL для освобождения в другой - просто идиотский стиль. Это никогда не будет переносимо и кто так делает - сам себе злобный баклан.

Date: 2009-09-10 07:26 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Почему это "никогда не будет переносимо"? Религия не позволяет? Это официально поддерживаемый сценарий - как раз путем динамической компоновки с одной копией CRT. Вдобавок не только память - но и другие объекты, пример с FILE* я ж не случайно привел.

Использование многих копий CRT требует особой осторожности при построении межмодульных интерфейсов, накладывает дополнительные ограничения на ровном месте.

Понятно, что для того, чтобы оправдать передачу memory ownership между модулями, нужны веские причины. Но если проект такой, что передавать ownership проще, чем не передавать - то желание экономить 500 кбайт на одной из поддерживаемых ОС не должно вставлять палки в колеса и ухудшать дизайн.

Передача ownership используется довольно часто - в интерфейсе zlib, скажем, есть функции zalloc и zfree, специально для того, чтобы избежать проблем с разными кучами. Кроме того, есть функции gzopen, которые принимают хендлы, возвращаемые CRT. Т.е. библиотека построена с расчетом на то, что c одной стороны, могут использоваться несколько копий CRT с разными кучами, а с другой стороны, что все вызовы open во всех копиях CRT не используют глобальных данных.

Если, скажем, делать библиотеку абсолютно портабельной, то надо либо делать и вызовы zopen, zsocket и т д, либо ограничивать способы использования CRT клиентами. В случае zlib оказалось лучше сделать так, как сделали, а в случае, когда все модули пишутся одним вендором, отказ от статической компоновки упростит дизайн и соответственно, сократит себестоимость разработки.

Грубо говоря, если в нашем приложении 150 вариантов zlib, то не надо будет копипейстить 150 функций zalloc/zfree или придумывать хитрые способы обойти проблему без копипейста.

Date: 2009-09-10 07:47 pm (UTC)
From: [identity profile] kunaifusu.livejournal.com
Почему это "никогда не будет переносимо"?
Потому, что стандарт языка ничего не знает о DLL и прочих системных заморочках. Вы с таким же успехом можете создать процесс и передавать ему адреса памяти через пайп - где-то это может и будет работать и, может быть, кто-то будет считать это "официальным поддерживаемым сценарием", но переносимым это никогда не будет.

Date: 2009-09-10 05:18 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
DEBUG version of MSVCRT that ships ONLY with VS2005 SP1 ATL Security Update 2

Так правильно - EULA вообще запрещает распространять DEBUG CRT в каком-либо виде, фактически Debug CRT платный, является частью студии, как, скажем, отладчик. Debug CRT может быть раза в три медленнее в определенных сценариях, чем релизный, из-за различных валидаций кучи, которые он выполняет для раннего обнаружения memory corruption, поэтому ни один разработчик в здравом уме и трезвой памяти не будет распространять его с бинарником своего софта.

Впрочем, я не удивлюсь, что окажется, что данный софт просто банально падает в релиз-версии, т.к. дебаг-црт по-другому инициализирует память, и, скажем, использует всякие паддинги вокруг блоков кучи вроде 0xBAADF00D ("bad food"), и глючный код, безобидно повреждающий в дебаг црт паддинг, при компоновке с релизной начал повреждать соседний блок.

Date: 2009-09-10 06:04 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Ну так это не вам, а разработчикам софта замечание, которые релизили такие чудовищные бинарники

Profile

wizzard: (Default)
wizzard

January 2019

S M T W T F S
  12 345
6789101112
1314 1516171819
202122 23242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 05:14 pm
Powered by Dreamwidth Studios