LINUX.ORG.RU

Сообщения PPP328

 

Как починить конфликт libicu на Ubuntu 18.04?

 , , ,

Эти [нет слов чтобы описать] умные люди сломали на Ubuntu 18.04 работу libicu-dev параллельно с libicu-dev:i386:

https://askubuntu.com/questions/1120326/install-libicu-dev-libicu-devi386-at-the-same-time-produce-error-at-ubuntu18-o

Сделав у них одинаковый пакет в одном и том же месте. Это даже в Debian починили, а в Ubuntu фикс не завезли уже два года как.

Как этот п****ц разгрести, если это мешает кросскомпилить и даже libxml2-dev из-за этого не поставить, потому что он зависит от libicu.

https://bugs.launchpad.net/ubuntu/+source/icu/+bug/1784135

Вроде как в debian это как-то починили, но не могу найти фикс.

PPP328
()

А почему никто не обсуждает, что Mozilla распространяет по техническим каналам политику?

 ,

Mozilla воспользовалась push-уведомлениями для распространения политической рекламы в Firefox

Пользователи мобильной версии Firefox для Android выражают возмущение нецелевым использованием функции доставки push-уведомлений для распространения рекламы публикации в блоге Mozilla с призывом подписать петицию StopHateForProfit, направленную против поддержки ненависти, расизма и дезинформации в Facebook. Уведомление было отправлено через активный по умолчанию канал «default2-notification-channel», предусмотренный для отправки важных технических уведомлений. Применение подобного канала для доставки политически ангажированной рекламы является неприемлемым и рассматривается некоторыми пользователями как нарушение миссии Mozilla.

Собсно сабж.

https://www.opennet.ru/opennews/art.shtml?num=53427

PPP328
()

Как самостоятельно проверить ssl-сертификат?

 , ,

Предположим, что у нас есть контрол-сервер с доменом на https. Какие действия нам нужно совершить чтобы проверить, что это не evil twin с сертификатом от «Дядя Вася и Ко»?

К серверу подключаемся сокетом, потом работаем при помощи библиотеки openssl.

PPP328
()

Что сервер должен отвечать временно забаненному клиенту?

 , ,

Положим, что на сервере стоит авторизация и клиент использовал неверный ключ (речь не о живых людях, везде разговаривают машины Слава Роботам! Убить всех человеков!). Сервер банит клиента на какое-то время чтобы избежать подбора ключа (ждет когда ключ сменится). Так вот, какой код должен отвечать сервер (и должен ли отвечать вообще) если временно забаненный клиент продолжает долбиться на тот же апи с невалидным ключом.

PPP328
()

Прошу подтверждения бага - не работает gdebi на 18.04

 ,

Xubuntu 18.04.

При попытке установки пакета через gdebi-gtk он просто закрывается.

Если попробовать то же самое в консольной версии (на которой построен gdebi-gtk), то:

alex@ThinkPad-L560:~/downloads/dists$ sudo gdebi ./zoom_amd64_2.deb 
[sudo] пароль для alex: 
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Reading state information... Done

Zoom, #1 Video Conferencing and Web Conferencing Service 
 Zoom, the cloud meeting company, unifies cloud video conferencing, simple online meetings, and group messaging into one easy-to-use platform. Our solution offers the best video, audio, and screen-sharing experience across Zoom Rooms, Windows, Mac, Linux, iOS, Android, and H.323/SIP room systems.
Вы хотите установить этот пакет? [д/Н]y

alex@ThinkPad-L560:~/downloads/dists$ echo $?
0

alex@ThinkPad-L560:~/downloads/dists$ sudo gdebi ./zoom_amd64_2.deb 
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Reading state information... Done

Zoom, #1 Video Conferencing and Web Conferencing Service 
 Zoom, the cloud meeting company, unifies cloud video conferencing, simple online meetings, and group messaging into one easy-to-use platform. Our solution offers the best video, audio, and screen-sharing experience across Zoom Rooms, Windows, Mac, Linux, iOS, Android, and H.323/SIP room systems.
Вы хотите установить этот пакет? [д/Н]д
(Чтение базы данных … на данный момент установлено 277074 файла и каталога.)
Подготовка к распаковке ./zoom_amd64_2.deb …
Распаковывается zoom (5.0.418682.0603) на замену (3.5.361976.0301) …
run post uninstall script, action is upgrade ...
Настраивается пакет zoom (5.0.418682.0603) …
run post install script, action is configure...
Обрабатываются триггеры для gnome-menus (3.13.3-11ubuntu1.1) …
Обрабатываются триггеры для desktop-file-utils (0.23-1ubuntu3.18.04.2) …
Обрабатываются триггеры для mime-support (3.60ubuntu1) …
Обрабатываются триггеры для shared-mime-info (1.9-2) …

Предполагаю, что проблема в том, что он перестал реагировать на английские y/N, которые гуй ему и посылает.

PPP328
()

Нюансы запуска процессов через system/exec

 ,

Случай #1:

Как известно, при вызове exec происходит завершение всех нитей вызывающего кроме той, что вызвала system. При этом открытые дескрипторы клонируются в новый процесс (если у них не указан флаг FD/SOCK_CLOEXEC).

Представим следующую гипотетическую ситуацию:

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

Положим, что так как эта строка может содержать переменные среды, какие-то выражения подстановки и shell-related команды и синтаксис программист, написавший эту программу посчитал, что самым оптимальным образом будет запускать эту строку с помощью команды system, которая не требует списка аргументов, как семейство exec*. Плюс, так как system «под капотом» вызывает sh -c ..., то автоматически подставятся переменные, а shell-related команды и синтаксис будут работать как нужно. Так вот, глянем исходник system, например, для glibc:

<Сначала хотел показать исходник glibc, но тут слишком дофига получается кода, поэтому сжато: clone + exec + waitpid, кстати ман говорит про fork + exec + waitpid, что не совсем то же самое>

При вызове clone/fork происходит копирование открытых дескрипторов, которые наследует процесс, который запустил system. Предположим, что кто-то передал для запуска строку, содержащую запуск программы (назовем ее evil), выполняющей следующие действия:

if (fork() != 0)
    exit(0);

Что превращает ее в отвязанного от родителя демона. Однако этот fork тоже наследует все открытые хэндлеры, что приводит нас к тому, что этот демонутый процесс evil получил копию всех открытых хендлеров супервизора, однако стал от него отвязан (system вернул 0, супервизор считает, что работа выполнена).

Теперь предположим, что это супервизор с управлением по сети. То есть супервизор открывает серверный сокет и слушает команды, которые ему приходят извне. Не будем обсуждать защищенность передачи или канала связи, всё можно сломать, суть сейчас не в этом. Суть в том, что на момент запуска system супервизор владел открытым серверным сокетом (!). Да, по совести и по правилам при его создании ему нужно было выставить SOCK_CLOEXEC, но скажем честно, кто своим серверным сокетам выставляет флаг, о котором даже в мануалах на socket из 153 строк отдано 2 (!), т.е. всего 1.3%?

Таким образом, пройдя через всю цепочку форков копия серверного сокета оказывается у демонутого evil:

super      9053 alex    3u  IPv4 11458560      0t0  TCP *:34002 (LISTEN)
super      9053 alex    4u  IPv4 11464960      0t0  TCP localhost:34002->localhost:41308 (ESTABLISHED)
evil       9257 alex    3u  IPv4 11458560      0t0  TCP *:34002 (LISTEN)

Положим, что процесс супервизора по какой-то причине завершился. Ну, например, выполнив свою работу или по ошибке. И теперь начинается самая мякотка. Ведь в системе уже открыт слушающий на порту 34002 сокет! И принадлежит он программе evil! Таким образом она может прикинуться сервером, а супервизор, в свою очередь, не сможет вернуть свой сокет, поэтому система не даст ему открыть второй сокет на том же порту без REUSEPORT:

SO_REUSEPORT (since Linux 3.9)
              Permits multiple AF_INET or AF_INET6 sockets to be bound to an identical socket address.  This option must be set on each socket (including the first socket) prior to calling bind(2) on the socket.  To prevent port hijacking, all of  the  pro‐
              cesses binding to the same address must have the same effective UID.  This option can be employed with both TCP and UDP sockets.

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

Мы же не хотим port hijacking, верно? А вот все равно профукали. Ну и теперь evil может делать что угодно. Может получать данные от клиентов, может им даже что-то отвечать,может получать список команд для запуска и запускать вместо них что угодно, сообщая наверх что всё хорошо.

Собственно, вопрос #1: почему на серверный сокет автоматически при создании не вешается FD_CLOEXEC?

Случай #2:

Мы - супервизор, запускающий программы, забудем про сетевое взаимодействие, мы сами знаем, что нам запускать. Запускают нас от root, для того, чтобы мы могли делать какую-то очень важную вещь, ну, например, читать какой-то root-owned файл:

-rw-------  1 root root        7 июн  5 23:51 rootonly

Изобразим супервизор упрощенно:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <errno.h>       
#include <pwd.h>


static void dowork(void) {
    int pid = fork();
    int status;
    switch (pid) {
        case -1 : exit(EXIT_FAILURE);
        case 0  :
            if (setuid(1000) == -1) {
                printf("u:%u\n", errno);
            }
            if (seteuid(1000) == -1) {
                printf("e:%u\n", errno);
            }
            execl("./hijack_evil.elf", "./hijack_evil.elf", NULL);
            printf("cannot run\n");
            exit(EXIT_FAILURE);
        default :
            wait(&status);
    }
}

int main(void) {
    FILE * fileroot = fopen("/tmp/rootonly", "r");
    printf("I am %s, #%u/%u\n", getpwuid(getuid())->pw_name, geteuid(), getuid());
    
    dowork();
    
    fclose(fileroot);
    return 0;
}
gcc hijack_root.c -o hijack_root.elf

И программу, которой нельзя давать рутовые права:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <pwd.h>

int main(void) {
    printf("I am %s, #%u/%u\n", getpwuid(getuid())->pw_name, geteuid(), getuid());
    // my stdin is 0, stdout is 1, stderr is 2, therefore...
    char buf[1024];
    read(3, buf, 1024);
    printf("%s\n", buf);
    return 0;
}
gcc hijack_evil.c -o hijack_evil.elf

Проверяем, что просто так файл прочитать нельзя:

alex@ThinkPad-L560:~$ cat /tmp/rootonly 
cat: /tmp/rootonly: Отказано в доступе
alex@ThinkPad-L560:~$ echo $USER/$UID
alex/1000

И запускаем супервизор:

$ sudo ./hijack_root.elf 
I am root, #0/0
I am alex, #1000/1000
SECRET

При этом мы не можем ставить FD_CLOEXEC на каждый хендлер, открываемый в супервизоре, потому что он может понадобиться для целей супервизора в его форках. Соответственно вопрос #2: почему внешние программы, запускаемые через exec наследуют хендлеры? Ведь очевидно, что это может быть использовано только для «угона» файлов

PPP328
()

Как вызвать exec* без утечки памяти?

 ,

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

Соответственно, если параметры выделены на куче - формально происходит утечка памяти (still reachable в формулировке valgrind). Да, система заберет память назад по завершению процесса (флаг on close). Но ведь формально это неправильно.

Речь про случай, когда мы делаем fork перед exec.

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

Или может можно как-то по другому выделить?

PPP328
()

Прочитать stderr и stdout запускаемого приложения

 , ,

Гугл завален инструкциями с переадресацией stderr в stdout и использованием popen. Адекватного описания как сделать то, что мне надо не нашел. Такая задача никогда передо мной не вставала, поэтому прошу пояснить, как сделать то, что мне надо.

Что мне надо:

  1. Запустить заданную программу с аргументами
  2. По ее завершению прочитать весь её stdout и stderr отдельно

Переадресовать их в физические файлы и потом их прочитать нельзя - саму команду редактировать нельзя (там могут быть и редиректы и всё прочее), нужно только актуально то, что она выплюнула в out/err.

Вангую что тут надо как-то совокупить dup2, exec а потом вычитать через fgets. Но чот оно у меня не стыкуется.

Кто может направить в правильную сторону?

PPP328
()

Как снять копию DVD с многократным повторением чтения блоков?

 , , ,

dd if=/dev/dvd of=a.iso

Дропается на первой ошибке

dd if=/dev/dvd of=a.iso conv=noerror,sync

Будет писать в файл херню, если не прочтет блок.

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


Всё, всем спасибо!

После ребута наконец-таки нормализовался размер того, что выдавал dd и ddrescue. Оригинальный размер диска - 6.9ГБ, они оба выдавали 6.6. После ребута нормализовались к 6.9 и НЕ ВЫДАВАЛИ ОШИБОК ЧТЕНИЯ. Похоже, что резаку становится плохо, если через него подряд копировать много дисков. Кстати старая попытка через dd скопировать диск заняла 8.2 ГБ, 83% от которого - это искомые 6.9 ГБ. Так что видимо контроллер или ядро выдавали неверный размер.

PPP328
()

У новых мобильных Intel частота 1.8- норма?

 ,

Что-то как-то ссыкотно покупать новый ноутбук с такой частотой процессора. На моем синке трехлетней давности

model name	: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

А на почти всех новых моделях стоят свежего поколения, но частота 1.8
https://i.postimg.cc/4dR9shcV/2020-04-27-11-54-41.png

Это норма или они медленнее старых?

PPP328
()

Linux, работающий через телетайп. А винда так может?

 

https://youtu.be/2XLZ4Z8LpEE

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

Что-то мне подсказывает, что винда даже не все старые мониторы может поддерживать.

PPP328
()

А вы будете работать на «нерабочей» неделе?

 

С учетом многочисленных сообщений о том, что кто-то будет работать несмотря на «пожелания» ВВП хотелось бы узнать, как много таких.

  1. Да, я работаю в IT 777 (61%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************************

  2. Я не работаю. Вообще. 156 (12%)

    ****************************************************************

  3. Да, я работаю в чем-то другом 153 (12%)

    ***************************************************************

  4. Нет, я работаю в чем-то другом 69 (5%)

    ****************************

  5. Нет, я работаю в IT 61 (5%)

    *************************

  6. Да, я работаю в чем-то необходимом (аптеки, и пр.) 58 (5%)

    ***********************

  7. Нет, я работаю в чем-то необходимом (аптеки, и пр.) 4 (0%)

    *

Всего голосов: 1278

PPP328
()

Помогите вспомнить игру

 ,

То ли под онтопик, то ли под оффтопик, вспомнить уже не могу.

Вышла достаточно давно (до 2015 точно, возможно до 2010), графика на уровне Vice City. 3D, от третьего лица. Основной сюжет вертится вокруг девушки, живущей в будущем, вечно что-то болтает про то, что государство контролирует нас через воду в кулерах. Что-то случается (типа как анимус в AC) и она попадает в средневековье, где нужно что-то сделать, ибо зло грядет.

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

Называлась как-то в духе «neverending story» (но, разумеется не она).

Может кто напомнит мне как это называлось?

PPP328
()

Подобрать криптоалгоритм

 

Помогите, пожалуйста, подобрать криптоалгоритм с ассиметричным ключом.

Входные данные:
Есть Боб, и Алиса.
Алиса транслирует в космос свой публичный ключ.
Нужно подобрать криптоалгоритм, благодаря которому Алиса сможет подтвердить, что сообщение именно от Боба.

Условия можно дополнять.
Единственное «но» - у Алисы нет интернета.
Что можно по этому поводу попробовать?

PPP328
()

Бесшовное переключение от сети к батарее и обратно

 ,

Есть STM-ина, которая ест +5v, питается от USB-компа\зарядника. Задача в том, чтобы при пропадании питания продолжать работу какое-то значительное (>нескольких секунд) время.

Как понял из гуглежа задача не совсем тривиальная по разным причинам.

Рассматривал разные варианты, просто подключенную параллельно батарею с диодом сторону выхода вычеркнул из вариантов, потому что падение на диоде около 1в и при батарее в 4.2-4.7в оно упадет ниже лимита включения STM (вариант 1).

Вторым вариантом мне предложили поставить контроллер заряда TP4056 и брать питание с выходов батареи (схема: вот (---) ) Но у меня к этому есть вопросы - разве не будет при такой схеме постоянно напрягаться батарея от того, что с нее забирается заряд а контроллер постоянно подливает на нее? Ей не поплохеет?

Третим вариантом рассматривал релейное переключение а для компенсации времени срабатывания реле поставить ионистор для поддержания питания около секунды.

Еще был вариант взять вариант 1, но дополнительно поставить DC-DC с 3..5в -> 5в. Звучит здраво, но меня все еще напрягает, что диод жрет и греется. Или плевать?

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

Одно из условий - бесшовное переключение - STM’ина не должна ребутнуться, потому что одна из закоженных функций - отсчет времени.

Заранее спасибо.

PPP328
()

Ростов-на-Дону, Программист С

 , , ,

Требуемый опыт работы: 1-3 года Полная занятость, полный день

Кто мы:

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

Кто нам нужен:

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

От тебя потребуется:

  • Опыт разработки на С или С++ на Linux от года (C в приоритете);
  • Опыт разработки сетевых приложений, знание сетевого стека;
  • Базовые знания устройтва *nix систем;
  • Умение работать со скриптовыми языками;
  • Знание системы контроля версий.

Плюсом будет:

  • Опыт работы с удаленными устройствами через TCP+binary/HTTP/SOAP/MODBUS;
  • Опыт работы с Perl;
  • Умение соответствовать стандартам безопасности MISRA C/NASA JPL;
  • Умение работать с системами отладки и анализа (GDB, Callgrind, Memcheck, Valgrind, CPPcheck, scan-build);
  • Умение работать с SQL базами;
  • Опыт разработки Windows приложений.
  • Опыт работы или базовые знания assembler

Гарантируем

  • Интересные задачи, простую и прозрачную систему организации работы;
  • Оплачиваемое обучение, участие в профильных конференциях;
  • Стабильно высокую заработную плату, постоянные индексации;
  • Годовую премию, ДМС;
  • Дружный коллектив единомышленников;
  • Перспективы профессионального и карьерного роста;
  • Оформление по ТК РФ;
  • Своя кухня, чай/кофе, печеньки, мюсли для приятного и уютного перерыва;
  • Корпоративные праздники и спортивные тренировки;
  • Современный офис в самом центре с панорамным видом на город;
  • Рабочее место, оборудованное всем необходимым для продуктивной работы.

Заработная плата

По результатам собеседования, мин. 70 000р.

Связь


Дополнительные вопросы по вакансии можно спросить здесь или по указанным средствам связи.

PPP328
()

Импорт в FireBird, файл без сперазделителя

 

Есть файл схемы\пл-функций\всякой подобной бурды на 18к строк.

Пытаюсь заимпортить его через ISQL - говорит «не, бать, надо каждую функцию отделять спецразделителем, а то я не понимать, когда у тебя кончается строка в функции, а когда функция». Типа:

SET TERM ^;
CREATE PROCEDURE "TEST" ("A" INTEGER)
AS
BEGIN
   EXIT;
END ^
SET TERM ;^

У меня же все функции имеют в окончании END*;*, я так понял что так работает утилита экспорта.

Как мне импортировать это легаси-говно, которое даже распарсить собственный синтаксис не может чтобы не править руками 18к строк?

PPP328
()

Куда жаловаться по 404 на сайте убунты?

 

http://cdimage.ubuntu.com/netboot/19.10/

i386 - For 32-bit Intel/AMD (x86) - 404

Куда писать?

PPP328
()

Какая-то странная реализация memcpy в glibc

 , ,

Взял мастер, т.е. всё более-менее свежее.

Имеем:

void *
MEMCPY (void *dstpp, const void *srcpp, size_t len)
{
  unsigned long int dstp = (long int) dstpp;
  unsigned long int srcp = (long int) srcpp;

  /* Copy from the beginning to the end.  */

  /* If there not too few bytes to copy, use word copy.  */
  if (len >= OP_T_THRES)
    {
      /* Copy just a few bytes to make DSTP aligned.  */
      len -= (-dstp) % OPSIZ;
      BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);

      /* Copy whole pages from SRCP to DSTP by virtual address manipulation,
	 as much as possible.  */

      PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);

      /* Copy from SRCP to DSTP taking advantage of the known alignment of
	 DSTP.  Number of bytes remaining is put in the third argument,
	 i.e. in LEN.  This number may vary from machine to machine.  */

      WORD_COPY_FWD (dstp, srcp, len, len);

      /* Fall out and copy the tail.  */
    }

  /* There are just a few bytes to copy.  Use byte memory operations.  */
  BYTE_COPY_FWD (dstp, srcp, len);

  return dstpp;
}

Вроде всё self-documented, но поясню: Смотрим, достаточно ли байтов, чтобы копировать пачкой или не стоит мараться. Если достаточно, копируем следующим образом:

  1. Сначала копируем байтами, чтобы выровнять адресацию до 8, чтобы можно было копировать по выровненному адресу сразу по страницам. (BYTE_COPY_FWD)
  2. Копируем по 8 байт чтобы добить до размера страницы (внутри PAGE_COPY_FWD_MAYBE)
  3. Копируем по страницам сколько можем (внутри PAGE_COPY_FWD_MAYBE)
  4. Копируем по 8 байт сколько можем (WORD_COPY_FWD)
  5. Копируем байтами остатки. (BYTE_COPY_FWD)

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

(Для простоты опустим копирование страницами, для общего понимания проблемы оно сейчас не важно, тем более что в текущей реализации glibc для i386 оно ВНЕЗАПНО не реализовано) Положим на вход идут адреса 0x7f и 0x17f и нужно скопировать 20 байт.

  1. Чтобы добить до границы выравнивания по 8 копируем один байт из 0x17f в 0x7f (L теперь 19)
  2. Теперь копируем по 8 while (L>8).
  3. Добиваем остаток байтами.

Ура, мы скопировали. Никакого misalign access и все асаны-сасаны молчат.

А теперь берем адреса 0xf7 и 0x181

  1. Добиваем до границы 8 байт - копируем 1 байт. Теперь адреса 0x80 и 0x182
  2. Ииии… Всё, дальше копировать блоками нельзя - мы либо будем читать по невыравненному адресу либо писать, если попытаемся выровняться по источнику. ASAN и в том и другом случае мне жужжит, что если я хочу быть пай-мальчиком, то так нельзя.

Вопросы:

  • Почему у glibc это канает? Я прожамкал их сорцы, там нет решения этой проблемы.

Чтобы качнуть сорцы: git clone git://sourceware.org/git/glibc.git

P.S. Если знаете кого-то, кто на форуме может теоретически ответить - кастаните в тред, плиз. P.P.S. Это, конечно, забавно, что gcc на -O0/1/2 игнорит оптимизацию алгоритма и разворачивает его только на -О3 (xmm во все поля): https://gcc.godbolt.org/z/LpJg6s , но странно, что такой же реализации нет в glibc - одна из них все равно медленнее, почему не заменить более медленную реализацию более быстрой в одном из источников?

PPP328
()

Покритикуйте, пожалуйста, код

 ,

Написал свой первый hello world на nasm'е. Покритикуйте, пожалуйста.

Изначально писалось чтобы быть зашифрованным выхлопом для IOCCC, но по размеру в декодер не влезло, поэтому открываю сорс и ищу критику.

https://github.com/codemeow/freelancer/blob/master/freelancer.asm

PPP328
()