Не работает __forceinline с кодом во внешних .obj

Тема в разделе "WASM.BEGINNERS", создана пользователем Flaer, 29 май 2022.

  1. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    Есть функции определенные в исходнике на Си как extern с модификатором __forceinline
    Эти функции компилируются в FASM в .OBJ файлы и линкуются вместе с проектом на Си
    Собственно вопрос, почему не работает __forceinline и код функции из OBJ не встраивается в места, где он вызывается в Си
    Если в этом же исходнике Си любую функцию я почему как
    __forceinline, то она прекрасно инлайнится
    Как заставить инлайниться функции из внешних OBJ ?
    Может быть нужно собрать .lib ? В таком случае ткните носом как это сделать на FASM\MASM
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.459
    Адрес:
    Россия, Нижний Новгород
    Компилятор не знает, какие сайд-эффекты возможны при инлайне твоей функции, а также не знает, как трансформировать твою функцию, чтобы заинлайнить её правильно.
    Поэтому функции из сторонних obj’ей и obj’ей, созданных на основе самописного ассемблерного кода, не инлайнятся.

    Однако, для своих собственных obj’ей компилятор делает исключение.
    Если задать флаги межмодульной оптимизации (LTO/LTCG), компилятор (msvc в частности) получает возможность инлайнить функции из других объектных файлов так же, как если бы код был скомпилирован в одной единице трансляции.

    Это достигается путём откладывания генерации машинного кода на этап линковки: при включенных LTO/LTCG в obj’ах создаётся не машинный код, а некий байткод для виртуальной машины компилятора (как в LLVM), который преобразуется в машинный при линковке объектных файлов в один исполняемый.
    Это позволяет хранить информацию о сайд-эффектах функций и другую информацию, необходимую для инлайнинга.
     
    Flaer нравится это.
  3. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    Так, понятно, но как мне вставить в Си (x64) код, который нужно написать только на ассемблере, другие варианты не даны.
    Так же нужно что бы это была именно инлайн функция
    --- Сообщение объединено, 29 май 2022 ---
    Код весьма необычный и повторить это на Си нет возможности, но очень нужно сделать его инлайн функцией
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Я думаю, что для этого придется перейти на MinGW или Clang, где есть полноценные ассемблерные вставки для x64.
     
  5. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    MinGW или Clang поддерживает стандартные инструкции типа DB что бы обьявить байты прямо посреди ассемблерных команд ?
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.459
    Адрес:
    Россия, Нижний Новгород
    Поддерживает:
    Код (C++):
    1.  
    2. int main()
    3. {
    4.     asm(".byte 0x90");
    5.     return 0;
    6. }
    7.  
    Код (ASM):
    1.  
    2. main:
    3.         push    rbp
    4.         mov     rbp, rsp
    5.         .byte 0x90
    6.         mov     eax, 0
    7.         pop     rbp
    8.         ret
    9.  
     
  7. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    Блин, все же не очень удобно будет для моей задачи, я думал там хотя бы стандартный синтаксис масмовый будет, я писал обфускатор ассемблерного кода, который запутывает поток выполнения тысачами ветвлений, всевозможные переходы условные, а так же фейковые, которые никогда не произойдут, всяческие jmp\call reg с предварительным динамичным вычислением и расшифровкой адреса прыжка, вставка мусорных байт в теневые области кода, которые при дизассемблировании "отщипывают" от соседних инструкций байты и дизассемблер интерпретирует команды неверно. В общем достаточно много примочек против статичного и динамического анализа, в целом работает неплохо, даже умудряется свести с ума декомпиляторы IDA и Ghidra (скрин), и на графе видно что там полная каша, к слову исходник состоял из чуть более 4 строк укладывающих аргументы для вызова MessageBox и его показ.
    Но работает только строго со спецификациями чистого синтаксиса MASM и FASM, всякие отклонения не понимает, поэтому по всей видимости я не смогу использовать его для инлайн ассемблера в MinGW или Clang
    Мне просто лень возвращаться к этому проекту и добавлять в него поддержку еще инлайна Clang, поэтому думал, что как-то смогу заинлайнить шелл на FASM обработанный обфускатором.
     

    Вложения:

    • 11.png
      11.png
      Размер файла:
      529,7 КБ
      Просмотров:
      163
  8. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.459
    Адрес:
    Россия, Нижний Новгород
    Flaer, в CLang и gcc можно переключиться на синтаксис Intel.
    Или можешь использовать Intel C Compiler.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Но это все равно будет не MASM и не FASM, а GAS в случае с MinGW.