Comments 26
TFS умрет, счастье-то какое.
1ESУ меня какое-то предвзятое отношение к названиям, которые произносятся как «один эс».
О, может вы подскажете. В принципе для меня уже не актуально, просто интересно.
Есть баг: https://github.com/git-for-windows/git/issues/741
Он не в самом Git for Windows, а в экзешниках MinGW, которые он использует.
Там при запуске секции делаются writable через VirtualQuery() + VirtualProtect().
В исходниках предполагается, что VirtualQuery() всегда возвращает размер секции.
На некоторых компьютерах VirtualQuery() для секции ".text" возвращает не размер секции, а круглое число чуть меньшего размера. Как будто Windows при запуске программы разделяет секцию на 2 региона.
Проявлялось на нескольких машинах с Windows 7 с очень урезанными правами.
Разработчики исправлять не собираются, хотя это несложно. В принципе баг редкий, особо и не надо. Но было бы интересно узнать, из-за чего в Windows может быть такое поведение.
Ой, это ж перевод… Ну ладно, может кто другой подскажет.
because it's the bug of mingw, вернее ее реализация вокруг mark_section_writable
.
Поэтому и не собираются, ибо нефиг плодить воркараунды.
Т.е. баг делегирован дальше, имхо абсолютно правилно, см. MinGW-w64 — for 32 and 64 bit Windows / Bugs / #537 pseudo_reloc fails to mark pages writable
Под разработчиками я имел в виду разработчиков mingw, хотя и первых тоже. Одни используют программу других и не хотят напоминать им о баге, другие просто не хотят исправлять. Делегирован он другим пользователем, который и написал эту ссылку в комментах к багу на гитхабе. Вопрос у меня не в том как исправить, а почему у Windows может быть такое поведение относительно секций.
Я могу конечно ошибаться, но думается мне почему-то, что это ASLR (и-или DEP).
Если на машинках, где обоих можно выключить, баг не воспроизводится — оно говорит за-то...
Ну и если да, решения два (кроме как не юзать винду):
- не использовать абсолютных указателей (только относительные, не думаю что вариант для mingw)
- или бороться как я например тут для nginx делал, т.е. грубо говоря переалоцировать base, пока не выравняем блок у всех caller по одному адресу (good luck with its implementation;).
Ну или тот-же воркараунд на секции .text (MEM_WRITE как сделал Jason Bell), хотя не сукьюрно оно как-то.
а) меняет искомый адрес для соответствия границе страницы.
б) дает информацию только о наборе страниц, начиная с указанной, которые выделены одним вызовом, имеют одинаковые атрибуты доступа и состояние.
То есть однозначно гарантируется, что число опрошенных страниц не всегда равно выделенному числу страниц.
The function determines the attributes of the first page in the region and then scans subsequent pages until it scans the entire range of pages or until it encounters a page with a nonmatching set of attributes. The function returns the attributes and the size of the region of pages with matching attributes, in bytes. For example, if there is a 40 megabyte (MB) region of free memory, and VirtualQuery is called on a page that is 10 MB into the region, the function will obtain a state of MEM_FREE and a size of 30 MB.
Да, вот при запуске, когда выделяется память под секции, почему-то или делается 2 вызова или появляются страницы с другими атрибутами. Хотя вроде в заголовке атрибуты задаются на всю секцию, да и выделять память логично одним куском. Может конечно антивирус балуется, но все равно немного странно.
Он ругался не на С++, а на загрузку рантайма плюсов в ядро
Хм, про случай с GIT я не слышал.
В любом случае, между "добавить новый язык в единственную реализацию" и "сделать полностью совместимую обертку" есть огромная разница.
От GVFS, если что-то пойдет не так, легко отказаться. Просто понадобится больше локальных ресурсов на хранение репозитория целиком.
Масштабирование Git (и кое-какая предыстория)