Есть функции определенные в исходнике на Си как extern с модификатором __forceinline Эти функции компилируются в FASM в .OBJ файлы и линкуются вместе с проектом на Си Собственно вопрос, почему не работает __forceinline и код функции из OBJ не встраивается в места, где он вызывается в Си Если в этом же исходнике Си любую функцию я почему как __forceinline, то она прекрасно инлайнится Как заставить инлайниться функции из внешних OBJ ? Может быть нужно собрать .lib ? В таком случае ткните носом как это сделать на FASM\MASM
Компилятор не знает, какие сайд-эффекты возможны при инлайне твоей функции, а также не знает, как трансформировать твою функцию, чтобы заинлайнить её правильно. Поэтому функции из сторонних obj’ей и obj’ей, созданных на основе самописного ассемблерного кода, не инлайнятся. Однако, для своих собственных obj’ей компилятор делает исключение. Если задать флаги межмодульной оптимизации (LTO/LTCG), компилятор (msvc в частности) получает возможность инлайнить функции из других объектных файлов так же, как если бы код был скомпилирован в одной единице трансляции. Это достигается путём откладывания генерации машинного кода на этап линковки: при включенных LTO/LTCG в obj’ах создаётся не машинный код, а некий байткод для виртуальной машины компилятора (как в LLVM), который преобразуется в машинный при линковке объектных файлов в один исполняемый. Это позволяет хранить информацию о сайд-эффектах функций и другую информацию, необходимую для инлайнинга.
Так, понятно, но как мне вставить в Си (x64) код, который нужно написать только на ассемблере, другие варианты не даны. Так же нужно что бы это была именно инлайн функция --- Сообщение объединено, 29 май 2022 --- Код весьма необычный и повторить это на Си нет возможности, но очень нужно сделать его инлайн функцией
Я думаю, что для этого придется перейти на MinGW или Clang, где есть полноценные ассемблерные вставки для x64.
MinGW или Clang поддерживает стандартные инструкции типа DB что бы обьявить байты прямо посреди ассемблерных команд ?
Поддерживает: Код (C++): int main() { asm(".byte 0x90"); return 0; } Код (ASM): main: push rbp mov rbp, rsp .byte 0x90 mov eax, 0 pop rbp ret
Блин, все же не очень удобно будет для моей задачи, я думал там хотя бы стандартный синтаксис масмовый будет, я писал обфускатор ассемблерного кода, который запутывает поток выполнения тысачами ветвлений, всевозможные переходы условные, а так же фейковые, которые никогда не произойдут, всяческие jmp\call reg с предварительным динамичным вычислением и расшифровкой адреса прыжка, вставка мусорных байт в теневые области кода, которые при дизассемблировании "отщипывают" от соседних инструкций байты и дизассемблер интерпретирует команды неверно. В общем достаточно много примочек против статичного и динамического анализа, в целом работает неплохо, даже умудряется свести с ума декомпиляторы IDA и Ghidra (скрин), и на графе видно что там полная каша, к слову исходник состоял из чуть более 4 строк укладывающих аргументы для вызова MessageBox и его показ. Но работает только строго со спецификациями чистого синтаксиса MASM и FASM, всякие отклонения не понимает, поэтому по всей видимости я не смогу использовать его для инлайн ассемблера в MinGW или Clang Мне просто лень возвращаться к этому проекту и добавлять в него поддержку еще инлайна Clang, поэтому думал, что как-то смогу заинлайнить шелл на FASM обработанный обфускатором.
Flaer, в CLang и gcc можно переключиться на синтаксис Intel. Или можешь использовать Intel C Compiler.