• Как написать Netflow сенсор с нуля?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как мне модифицировать мою программу, чтобы она могла определять потоки и корректно отправлять их коллектору?

    Для этого тебе надо понять, что такое "потоки" о которых ты говоришь, где находится информация о принадлежности пакета потоку и как до неё добираться.

    Если ограничиться определением по ссылке, то тебе надо будет разбирать сырые пакеты до сетевого уровня, откидывать не-IP, из IP извлекать IP-протокол, адрес источника, адрес назначения и тип сервиса, для протоколов TCP и UDP дополнительно извлекать порт источника и порт назначения. Всё это довольно просто сделать самому вооружившись RFC по упомянутым протоколам. Также надо будет понять, что делать с фрагментированными IP-пакетами.
    Ответ написан
    Комментировать
  • Почему вычитается 32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему вычитается 32?

    Потому что компилятор использовал стековый кадр для хранения локальных переменных:

    pushq   %rbp
    movq    %rsp, %rbp
    subq    $32, %rsp
    movsd   %xmm0, -24(%rbp)
    movsd   %xmm1, -32(%rbp)

    -- сохранил два аргумента по смещениям -32 и -24

    movsd   -32(%rbp), %xmm0
    subsd   -24(%rbp), %xmm0
    movsd   %xmm0, -8(%rbp)

    -- сохранил их разность по смещению -8

    movsd   .LC0(%rip), %xmm0
    divsd   -8(%rbp), %xmm0
    movsd   %xmm0, -16(%rbp)

    -- сохранил частное от деления MAX_RAND на разность по смещению -16

    4 слота по 8 байт -- 32-байтный стековый кадр.
    Ответ написан
    3 комментария
  • Почему линкер дает такую ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    relocation R_X86_64_32S against `.text' can not be used when making a shared object
    что делать?

    Переписать код так, чтобы избавиться от этой релокации.
    Для этого посмотреть где она: objdump -dr lib.o

    27:   0f 01 1c 25 00 00 00    lidt   0x0
    2e:   00 
                            2b: R_X86_64_32S        .text


    и переписать загрузку idt без использования константного адреса, например так (используя адресацию относительно pc):
    lea rax, [rel idtDescriptor]
    lidt [rax]


    Однако, я подозреваю, что этого будет недостаточно, потому что
    dq _idt
    -- это ещё одна релокация в текстовом сегменте. Я не вижу как от неё можно избавиться кроме перемещения этой переменной в сегмент .data или .bss и инициализации этой переменной в процессе выполнения программы.
    Ответ написан
    3 комментария
  • Изминение запроса Amazon DynamoDB?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Слишком мало информации.
    Я долго изучал код

    Только по выводу дизассемблера или отладчиком ходил?
    пытался менять ... "0x013ded84 ldr x1, [x8, 0x250]"

    Выглядит разумно, но стоило бы под отладчиком посмотреть, что в x1 оказывается после этой инструкции. Я подозреваю, что адрес строки в памяти, а значит случайные изменения адреса откуда x1 загружается почти наверняка ничего не дадут.
    Задача либо понять "1" на любое нужное число, либо сделать так чтобы количество скачиваний было равным цене товара.

    Можно попробовать сохранить x1 каким он приходит к адресу 0x13ded40 в каком-нибудь callee-saved регистре (например x24) и перезагрузить обратно его вместо инструкции по адресу 0x13ded84. Как раз между этими адресами есть один nop и adrp x8, 0x2d71000 который теперь будет не нужен.
    Ответ написан
    1 комментарий
  • Как подключить несколько android-эмуляторов через adb?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как подключить несколько android-эмуляторов через adb?

    Используй ключ adb -s или переменную окружения $ANDROID_SERIAL. См.
    Ответ написан
    Комментировать
  • Как передать массив вместо аргументов?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если я правильно понял вопрос, то наиболее похожее из того что мне известно -- это семейство функций getcontext/makecontext/setcontext/swapcontext и __builtin_apply. И то и другое -- не готовое решение, с форматом передаваемого участка памяти прийдётся разбираться, а __builtin_apply определённо завязано на архитектуру и ABI и это gcc-specific.

    Но я думаю, что это неправильный подход к решению и вообще сам вопрос -- неправильный подход к решению. Если ты пишешь транслятор, то для функций с фиксированным набором аргументов ты можешь тупо сгенерировать код вызова функции удовлетворяющий всем правилам C++.
    Ответ написан
  • Что делать если компилятор nasm работает неправильно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    выдает непонятную фигню

    Ну в программе нет проверки ввода, поэтому если вводить непонятную фигню, то и выводить она будет непонятную фигню. А если вводить цифры, так чтобы сумма не превышала 9, то приведённая программа прекрасно работает.
    Это, правда не значит, что в этой программе нет ошибок. Я вижу как минимум одну:
    res resb 1 
    …
    mov [res], eax

    классическое переполнение буфера. Её наличие, правда, на результат повлиять не может.
    Ответ написан
    Комментировать
  • Зачем нужен signed в Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    по умолчанию int является signed

    А вот о char этого сказать нельзя, знаковость char зависит от реализации. Вдобавок, в стандарте есть следующая сноска (https://www.open-std.org/JTC1/SC22/WG14/www/docs/n... 6.2.5:15):
    Irrespective of the choice made, char is a separate type from the 
    other two and is not compatible with either.


    signed char -- это, пожалуй, единственное не вызывающее вопросов применение ключевого слова signed в C-коде написанном человеком. В остальных случаях роль signed -- чисто декоративная.
    Ответ написан
    Комментировать
  • Как сделать, чтобы printf() заменял -nan на любой заданный символ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сделать, чтобы вместо -nan печатался символ "-" ?

    Только добавив свою логику в свою программу, проверяющую значение на NaN и печатающую в зависимости от этого то или иное значение. С помощью стандартного printf -- никак.
    Ответ написан
    Комментировать
  • Как хранить два натуральных числа в одном, не превышающем их произведение (границы множества чисел для обоих из чисел известны)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    все это не подходит, так как мне нужно чтобы полученное число c лежало в промежутке [0; 11]


    Ну так a * (max(b) + 1) + b же.
    Иными словами мы делаем двузначное число в позиционной системе исчисления с неравными весами разрядов, младший разряд -- b, старший разряд -- a. Вес младшего разряда -- 1, вес старшего -- max(b) + 1.
    Ответ написан
    6 комментариев
  • Как из vector с int8_t получить int число?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как получить то же самое в С++?

    например так:
    uint8_t foo[] = {7, 7};
    int i = foo[0] + 256 * foo[1];


    В js я могу получить это так
    Int8Array

    Скажи,
    - а что будет, если элемент массива foo будет иметь отрицательное значение?
    - а что будет, если твой код запустить на архитектуре с порядком байт big-endian?
    Ответ написан
  • Указатели в языке Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему программа завершилась? Вмешалась ОС? Но если так, то почему?

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

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

    Значение указателя ты поменять можешь, но это не то, что было написано в коде. В коде было написано поменять значение на которое указатель указывает. Поменять указатель было бы a = (int *)10;

    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

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

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

    В памяти всё хранится как последовательность байтов. Любую последовательность байтов можно проинтерпретировать как указатель. Но чтобы компилятор С понял что ты имеешь в виду, ему надо явно сказать, что ты хочешь проинтерпретировать целое число как адрес: int *a = (int *)0x0061FF18;
    Ответ написан
    Комментировать
  • Ошибка bin: fatal: more than one input file specified: BootLoader.asm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    more than one input file specified
    nasm -felf64 bin BootLoader.asm -o BootLoader.bin

    nasm как бы говорит тебе: "выбери, или ты ассемблируешь bin или BootLoader.asm"
    Если же ты хотел формат 'bin', то выкинь -felf64 и замени его на -fbin.
    Тебе, правда, при этом прийдётся добавить что-нибудь типа use64 в исходник, чтобы сказать, что он не 16-битный.
    Ну и к тому же message у тебя лежит перед кодом, в той же секции, хороший bin из этого не получится.
    Ответ написан
  • Что нужно написать, чтобы загрузчик ос передавал управление коду в втором секторе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что нужно написать, чтобы загрузчик ос передавал управление коду в втором секторе?

    Нужно написать запрос в гугле: загрузчик ос и потом немного почитать.
    Ответ написан
    Комментировать
  • Не прошивается esp8266, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не прошивается esp8266, что делать?

    читать сообщение об ошибке, вот это:
    Arduino\libraries\ESP8266HttpClient-master/SerialResponse.h:15:10: fatal error: Delay.h: No such file or directory

    разбираться с разницей между "не прошивается" и "не компилируется".
    Ответ написан
    Комментировать
  • Почему mono в ubuntu не находит .so?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему-то в ubuntu она отказывается находить его, хотя он есть в папке с программой.

    добавь путь до каталога с этим файлом .so в переменную окружения LD_LIBRARY_PATH перед запуском программы.
    Ответ написан
  • Почему возникает ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    invalid abstract return type ‘Axis<unsigned int>’
    Почему возникает ошибка?

    Потому что Axis<unsigned int> -- абстрактный тип, а ты пытаешься вернуть объект такого типа.
    Скажи, что конкретно в сообщении об ошибке непонятно?
    Что с этим делать?
    - если тип не должен быть абстрактным -- смотреть в его иерархию наследования, искать недоопределённые чистые виртуальные функции и определять их или выкидывать.
    - если тип должен быть абстрактным -- пересмотреть свои взгляды на жизнь и начать возвращать либо ссылки, либо указатели на объекты абстрактного типа.
    Ответ написан
  • Почему тут ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    call of overloaded ‘Point2D()’ is ambiguous

    Потому что, похоже, у Point2D<T> больше одного конструктора по умолчанию.
    Ответ написан
    2 комментария
  • Почему inline функция не компилилируется?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так происходит?

    Потому что стандарт С11 (9899:201x 6.7.4:7, черновик доступен тут) говорит следующее про спецификатор inline:

    Any function with internal linkage can be an inline function. For a function
    with external linkage, the following restrictions apply: If a function is declared
    with an inline function specifier, then it shall also be defined in the same translation
    unit. If all of the file scope declarations for a function in a translation unit include
    the inline function specifier without extern, then the definition in that translation
    unit is an inline definition. An inline definition does not provide an external
    definition for the function, and does not forbid an external definition in another
    translation unit. An inline definition provides an alternative to an external
    definition, which a translator may use to implement any call to the function
    in the same translation unit. It is unspecified whether a call to the function uses
    the inline definition or the external definition.

    Самое главное тут -- в середине: инлайн-реализация не предоставляет и не запрещает реализацию со внешней линковкой, и в последнем предложении: транслятор волен сам выбирать, какую реализацию функции использовать -- инлайновую или со внешней линковкой.
    Поскольку ты написал так:
    inline void some_inline_func(uint32_t num)
    {
        . . .
    }

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

    Вариантов решения этой проблемы примерно 3:
    - определить функцию следующим образом:
    extern inline void some_inline_func(uint32_t num)
    {
        . . .
    }

    Такая функция будет доступна из других единиц трансляции.

    - либо определить функцию следующим образом:
    static inline void some_inline_func(uint32_t num)
    {
        . . .
    }

    Такая функция будет доступна только для данной единицы трансляции.

    - оставить в этом исходнике всё как есть, а в каком-нибудь другом определить следующую функцию:
    void some_inline_func(uint32_t num)
    {
        . . .
    }

    Это самый дурацкий вариант, поскольку эти две реализации могут не совпадать и в зависимости от выбора транслятора ты можешь получить разное поведение.
    Ответ написан
    Комментировать
  • Зачем производится закрытие файлового дескриптора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    зачем закрывается файловый дескриптор (exec 2<&-) перед тем как связать его с лог файлом?

    Я не вижу в этом никакого смысла, потому что системный вызов dup2 (которым вополняется связывание дескриптора логфайла с дескриптором #2) точно так же закрывает дескриптор в который происходит дупликация.
    Ответ написан