Что в linux в терминале, что в windows в мессажбоксе обычно видно, какой зависимости не хватает. Да, отсутствие мессажбокса при запуске ярлыка в linux это отдельная давняя проблема и никто её не пытается решить. А вот в случае с дотнетом тут одновременно сработало несколько багов (ещё раз отмечу, что под wine после нажатия кнопки ok открывается браузер со ссылкой на нужный дотнет, но под windows это сломано) Первый баг: если установлен хоть какой-то dotnet sdk - мессажбокс не появляется. Может microsoft предполагали, что если пользователь уже установил sdk, ему не нужен мессажбокс и он сам посмотрит что это за ассембли и поставит? Но на деле конечно же sdk обычно поставлен кем-то автоматически и пользователь о нём не в курсе. Второй баг - когда мессажбокс появляется, но кнопка ок ничего не делает. Видимо, воимя какой-то безопасности windows блокирует открытие браузера. Или это из-за политики принудительного навязвания microsoft edge пользователю. В любом случае, это происходит на чистой windows, подключённой к домену. На windows без домена не проверял - но тут проблема очевидна, разрабочтки винды не согласовали свои же продукты между собой, сам по себе браузер на этой windows работает. На самом деле если бы мессажбокс указывал требуемую версию - проблема была бы несущественна. Но он пишет просто мол установите дотнет, а этих дотнетов уже пруд пруди. Да, наверно с aot ситуация была бы лучше, но когда проблема для меня была актуально .net7 ещё только появился и код писался под 5 и 6. Так же .net7 вроде как (если я не ошибаюсь) установлен в windows 11 по дефолту и всё выше шансы, что он будет уже установлен в системе даже на десятке Касательно же отдельного лончера - может это и решение, но у лончера тоже есть какие-то зависимост и если я пишу на кроссплатформенном дотнете, то мне не хотелось бы обвязвать его платформенными лончерами. Так или иначе, в exe файле, запускающем дотнет уже есть механизм, показывающий этот мессажбокс и открывающий браузер. Просто оно не работает из-за вышеописанных багов
Обычно такой софт приходится таскать вместе с рантаймом. Исключение - какой нибудь старый dotnet 4 или ниже. Пробуешь запустить софт, собранный 5, 6, 7 дотнетом на десятке, что происходит? Ну тут несколько вариантов. Первый - вообще ничего. На запуск exe никак не реагирует. Второй - появляется мессажбокс, мол надо установить дотнет с кнопкой ok, которая ничего не делает. Даже версию дотнета не пишет. Под wine почему-то эта кнопка ok запускает браузер со ссылкой на нужный дотнет, но под десяткой ничего не происходит. Вот и приходится вместо 100кб приложения делать 100мб self-contained.
C windows XP-vista всё было легко решить заранее, в установщике windows (через shift+f10) сохранив профиль оборудования ещё до того, как все эти драйвера поставились. Тогда при переезде на другую машину достаточно было выбратть этот сохранённый профиль. Если у системы несовместимый процессор - ещё добавить опцию загрузки нужного варианта ntoskrnl. В windows 7 всё это поломали - теперь профилей оборудования нет. Это кстати для меня была основная причина ухода с windows - в XP я прекрасно мог использовать одну инсталляцию на нескольких разных ситемах (в том числе виртуалке), в семёрке это перестало работать. Десятка конечно грузится на разных конфигурациях - но со скрипом. К сожалению ей нельзя подсказать мол это другое железо и грузи другой профиль - она будет весь его перелопачивать. В линуксах хоть штатного механизма что-то такое сделать нет, но можно установитть 2 разных ядра под разные конфигурации и в инитскриптах сколхозить проверку по cmdline, меня енвы в зависимости от того, какое из ядер загружено, таким образом, например, выбрав использование mesa или блоба nvidia.
Собирать со старой версией - тоже не панацея. Линкуясь к символами старых- версий glibc ты получаешь неэффективные/небезопасные bug compatible реализации. Где-то может всплыть ASLR bypass, где-то просто очень тормозной вариант функции. В бородатых glibc memcpy делал memmove вообще. Есть конечно ещё способ - перед линковкой снести из glibc версии тех символов, для которых нужна актуальная реализация. То есть взять какой-нибудь 2.13 и снести версии с memcpy, математических функций и libc_start_main - тогда по идее будет одновременно и совсестимый со всем бинарь и при этом ему будут доступны все современные функции. Но такое может легко сломаться. Ещё на что стоит обратить внимание при сборки portable бинарей - то, как сделан android ndk. Там вместо настоящих библиотек лежат специальные заглушки, которые линкуют правильные версии символов. Возможно основная проблема даже не в том, что влинковываются последние версии символов, а в том, что в линуксе софт линкуется к системной glibc. В то время в других ОС есть специальные тулчейны с платформами, таргетирующие определённую версию ОС и дающие гарантии совместимости. В windows вообще линковка идёт не к dll, а к специальным либархивам с thunk'ами - если софт собран с windows7 sdk в режиме совместимости с XP - он и будет бинарно совместим с XP, даже если линковался на windows 11
К сожалению, ленивые разрабы решили его не проходить, вместо этого пихая каждое приложение в контейнер. В принципе такой подход сейчас везде популярен - магазины приложений во всех ОС делают песочницы, но в линуксе эта песочница сделана с максимальным оверхедом. У меня один вопрос к флетпаку - почему они не решили поднимать kvm виртуалку со своим ядром под каждое приложение для полной изоляциии
В основном конечно ломается софт из эпохи до-sse, когда требование к выравниванию стека было 4 байта. Ещё были проблемы с 32битным файл-оффсетом. Насколько я помню, это уже нормально не работает:
Snap/Flatpak только загоняют проблемы дальше и последние версии glibc уже настолько забыли о совместимости, что именно на glibc последних нескольких лет стали ломаться многие старые игры. Другая проблема - что нельзя несколько libc использовать одновременно - такое вполне работает на windows, который спокойно грузит в процесс несколько версий msvcrt/ucrt и они не дерутся между собой, но в linux это всегда проблема т.к символ не привязан к модулю и даже если несколько libc загрузятся, то символы будут использоваться от одной
нет, главное тут не цена. Доступные устройства уже были и есть в виде quest 2, но жутко огороженные... И главное, даже за большие деньги нельзя купить автономный девайс, не привязанный к сервису и с разлоченным загрузчиком. Qualcomm жутко печётся о своих устройствах как бы кто их не рутанул, в итоге консоль взломать проще, чем шлем.
Что сейчас имеем:
Quest, который не работает без аккаунта и может разлогиниться в любой момент, превращаясь в кирпич без доступа к серверам, да ещё и прошивку обновляет без ведома пользователя Китайцы (Pico), которые на новых прошивках без доступа к серверам не дают даже установить приложение, а на старых не поддерживают новую переферию (трекеры) B2B сегмент, который стоит кучу денег и имеет худшие характеристики, да и наверняка с привязкой к их бизнес-сервисам.
Единственный XR2 не нарушающий приватность, без блокировки загрузчика - Lynx R1, но их выпущены единицы, проект фактически провалился, а характеристики уровня 2020 года в 2025. Есть ещё всякие девкиты, но их сложно раздобыть и там не будет даже openxr. Если появятся шлемы дешевле - это никак не повлияет на ситуацию. Появятся ли шлемы, меньше завязанные на сервисы? Посмотрим, но что-то мне кажется, что никому из производителей этого не надо
Мой пока живой. Они как-то выборочно отключают. Скорее всего там не адреса отвалились, а сама виртуалка, либо что-то легло из-за того что ipv4 с самой виртуалки недоступен. В этом плане dns64/nat64 пока помогает - работает в качестве socks proxy т.к что-то серьёзнее держать на сервере, который может в любой момент сдохнуть навсегда не хочется
на моём allwinner a20 гибернация работает, сон нет (и не будет скорее всего т.к на этом чипе он слишком хитро реализован)
Если там mainline то может и работает. Под вопросом поддерживается ли он драйверами gpu и других компонентов SoC, самим ядром точно поддерживается
Что в linux в терминале, что в windows в мессажбоксе обычно видно, какой зависимости не хватает. Да, отсутствие мессажбокса при запуске ярлыка в linux это отдельная давняя проблема и никто её не пытается решить.
А вот в случае с дотнетом тут одновременно сработало несколько багов (ещё раз отмечу, что под wine после нажатия кнопки ok открывается браузер со ссылкой на нужный дотнет, но под windows это сломано)
Первый баг: если установлен хоть какой-то dotnet sdk - мессажбокс не появляется. Может microsoft предполагали, что если пользователь уже установил sdk, ему не нужен мессажбокс и он сам посмотрит что это за ассембли и поставит? Но на деле конечно же sdk обычно поставлен кем-то автоматически и пользователь о нём не в курсе.
Второй баг - когда мессажбокс появляется, но кнопка ок ничего не делает. Видимо, воимя какой-то безопасности windows блокирует открытие браузера. Или это из-за политики принудительного навязвания microsoft edge пользователю. В любом случае, это происходит на чистой windows, подключённой к домену. На windows без домена не проверял - но тут проблема очевидна, разрабочтки винды не согласовали свои же продукты между собой, сам по себе браузер на этой windows работает.
На самом деле если бы мессажбокс указывал требуемую версию - проблема была бы несущественна. Но он пишет просто мол установите дотнет, а этих дотнетов уже пруд пруди.
Да, наверно с aot ситуация была бы лучше, но когда проблема для меня была актуально .net7 ещё только появился и код писался под 5 и 6. Так же .net7 вроде как (если я не ошибаюсь) установлен в windows 11 по дефолту и всё выше шансы, что он будет уже установлен в системе даже на десятке
Касательно же отдельного лончера - может это и решение, но у лончера тоже есть какие-то зависимост и если я пишу на кроссплатформенном дотнете, то мне не хотелось бы обвязвать его платформенными лончерами. Так или иначе, в exe файле, запускающем дотнет уже есть механизм, показывающий этот мессажбокс и открывающий браузер. Просто оно не работает из-за вышеописанных багов
Обычно такой софт приходится таскать вместе с рантаймом. Исключение - какой нибудь старый dotnet 4 или ниже.
Пробуешь запустить софт, собранный 5, 6, 7 дотнетом на десятке, что происходит?
Ну тут несколько вариантов. Первый - вообще ничего. На запуск exe никак не реагирует.
Второй - появляется мессажбокс, мол надо установить дотнет с кнопкой ok, которая ничего не делает. Даже версию дотнета не пишет. Под wine почему-то эта кнопка ok запускает браузер со ссылкой на нужный дотнет, но под десяткой ничего не происходит.
Вот и приходится вместо 100кб приложения делать 100мб self-contained.
обычно там не сетевой адаптер, а serial порт. К тому же откуда у диска доступ к СМС?
Зато до семёрки можно было сделать 2 профиля оборудования, для которых были полностью разные множества драйверов
C windows XP-vista всё было легко решить заранее, в установщике windows (через shift+f10) сохранив профиль оборудования ещё до того, как все эти драйвера поставились.
Тогда при переезде на другую машину достаточно было выбратть этот сохранённый профиль. Если у системы несовместимый процессор - ещё добавить опцию загрузки нужного варианта ntoskrnl.
В windows 7 всё это поломали - теперь профилей оборудования нет. Это кстати для меня была основная причина ухода с windows - в XP я прекрасно мог использовать одну инсталляцию на нескольких разных ситемах (в том числе виртуалке), в семёрке это перестало работать. Десятка конечно грузится на разных конфигурациях - но со скрипом. К сожалению ей нельзя подсказать мол это другое железо и грузи другой профиль - она будет весь его перелопачивать.
В линуксах хоть штатного механизма что-то такое сделать нет, но можно установитть 2 разных ядра под разные конфигурации и в инитскриптах сколхозить проверку по cmdline, меня енвы в зависимости от того, какое из ядер загружено, таким образом, например, выбрав использование mesa или блоба nvidia.
Собирать со старой версией - тоже не панацея. Линкуясь к символами старых- версий glibc ты получаешь неэффективные/небезопасные bug compatible реализации. Где-то может всплыть ASLR bypass, где-то просто очень тормозной вариант функции.
В бородатых glibc memcpy делал memmove вообще. Есть конечно ещё способ - перед линковкой снести из glibc версии тех символов, для которых нужна актуальная реализация. То есть взять какой-нибудь 2.13 и снести версии с memcpy, математических функций и libc_start_main - тогда по идее будет одновременно и совсестимый со всем бинарь и при этом ему будут доступны все современные функции.
Но такое может легко сломаться.
Ещё на что стоит обратить внимание при сборки portable бинарей - то, как сделан android ndk.
Там вместо настоящих библиотек лежат специальные заглушки, которые линкуют правильные версии символов. Возможно основная проблема даже не в том, что влинковываются последние версии символов, а в том, что в линуксе софт линкуется к системной glibc. В то время в других ОС есть специальные тулчейны с платформами, таргетирующие определённую версию ОС и дающие гарантии совместимости. В windows вообще линковка идёт не к dll, а к специальным либархивам с thunk'ами - если софт собран с windows7 sdk в режиме совместимости с XP - он и будет бинарно совместим с XP, даже если линковался на windows 11
К сожалению, ленивые разрабы решили его не проходить, вместо этого пихая каждое приложение в контейнер. В принципе такой подход сейчас везде популярен - магазины приложений во всех ОС делают песочницы, но в линуксе эта песочница сделана с максимальным оверхедом. У меня один вопрос к флетпаку - почему они не решили поднимать kvm виртуалку со своим ядром под каждое приложение для полной изоляциии
В основном конечно ломается софт из эпохи до-sse, когда требование к выравниванию стека было 4 байта. Ещё были проблемы с 32битным файл-оффсетом.
Насколько я помню, это уже нормально не работает:
https://habr.com/ru/articles/91986/
Предложенное решение очень похоже на то, что я неоднократно озвучивал на ЛОРе: https://www.linux.org.ru/articles/development/17183665?cid=17185690
Snap/Flatpak только загоняют проблемы дальше и последние версии glibc уже настолько забыли о совместимости, что именно на glibc последних нескольких лет стали ломаться многие старые игры.
Другая проблема - что нельзя несколько libc использовать одновременно - такое вполне работает на windows, который спокойно грузит в процесс несколько версий msvcrt/ucrt и они не дерутся между собой, но в linux это всегда проблема т.к символ не привязан к модулю и даже если несколько libc загрузятся, то символы будут использоваться от одной
нет, главное тут не цена. Доступные устройства уже были и есть в виде quest 2, но жутко огороженные...
И главное, даже за большие деньги нельзя купить автономный девайс, не привязанный к сервису и с разлоченным загрузчиком. Qualcomm жутко печётся о своих устройствах как бы кто их не рутанул, в итоге консоль взломать проще, чем шлем.
Что сейчас имеем:
Quest, который не работает без аккаунта и может разлогиниться в любой момент, превращаясь в кирпич без доступа к серверам, да ещё и прошивку обновляет без ведома пользователя
Китайцы (Pico), которые на новых прошивках без доступа к серверам не дают даже установить приложение, а на старых не поддерживают новую переферию (трекеры)
B2B сегмент, который стоит кучу денег и имеет худшие характеристики, да и наверняка с привязкой к их бизнес-сервисам.
Единственный XR2 не нарушающий приватность, без блокировки загрузчика - Lynx R1, но их выпущены единицы, проект фактически провалился, а характеристики уровня 2020 года в 2025. Есть ещё всякие девкиты, но их сложно раздобыть и там не будет даже openxr.
Если появятся шлемы дешевле - это никак не повлияет на ситуацию. Появятся ли шлемы, меньше завязанные на сервисы? Посмотрим, но что-то мне кажется, что никому из производителей этого не надо
oculus уже в принципе нет, а то, что его поглотило - конкурент google и вряд ли заинтересовано в технологии, которая должна быть как бы для всех
А может всё-таки не надо еду в инстаграм?
Мой пока живой. Они как-то выборочно отключают. Скорее всего там не адреса отвалились, а сама виртуалка, либо что-то легло из-за того что ipv4 с самой виртуалки недоступен. В этом плане dns64/nat64 пока помогает - работает в качестве socks proxy т.к что-то серьёзнее держать на сервере, который может в любой момент сдохнуть навсегда не хочется
Вероятно тем, что современные сигареты с некачественными сиропами вызывают у некоторых людей аллергическую реакцию?
У меня был настроен ipv6 адрес и он ещё работает. Как теперь без панели добавить ipv4 не знаю
Если там mainline то может и работает. Под вопросом поддерживается ли он драйверами gpu и других компонентов SoC, самим ядром точно поддерживается
github.com/rainers/cv2pdb
уже давно использую его чтобы выводить красивый стектрейс через dbghelp