Как сгенерировать ассемблируемый код для сборки из исходного кода c на Linux?

Тестовая платформа - 32-битный Linux.

В принципе, я знаю, что gcc можно использовать для генерации кода сборки в стиле Intel и At&T, но кажется, что вы не можете напрямую использовать nasm / tasm для компиляции сгенерированного кода сборки в стиле Intel.

Я выполняю ассемблерный код для анализа проектов как на Windows, так и на платформе Linux, поэтому я думаю, что если они могут быть скомпилированы независимым от платформы ассемблером, таким как nasm \ yasm, мне было бы намного проще...

Итак, мой вопрос заключается в том, как сгенерировать сборочный код для сборки из nasm из исходного кода c в Linux?

2 ответа

Решение

Я считаю, что лучше разбирать объектные файлы, чем использовать ассемблерный код, сгенерированный gcc.

  1. Сначала сгенерируйте объектный файл из вашего исходного кода:

    gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
    

    -fno-asynchronous-unwind-tables: не генерировать ненужные разделы, такие как .eh_frame

    -O2 оптимизирует, чтобы ассм не был ужасным. Опционально использовать -Os (размер за скорость) или -O3 (полная оптимизация, включая авто-векторизацию). Также вы можете настроить процессор и использовать расширения, которые он поддерживает с -march=native или же -march=haswell или же -march=znver1 (Zen)

    -s: сделать меньший исполняемый файл (strip)

    -c -o main.o: компилировать, но не связывать, генерировать объектный файл с именем main.o

  2. Используйте objconv для генерации nasm код:

    objconv -fnasm main.o
    

    Результат будет сохранен в main.asm,

  3. Результат будет очень близок к синтаксису Nasm. Однако вам может потребоваться внести некоторые незначительные изменения, чтобы устранить предупреждения / ошибки. Просто попробуйте скомпилировать это с Nasm

    nasm -f elf32 main.asm
    

    и исправить ошибки / предупреждения вручную. Например:

    • удалить align=N а также execute/noexecute слова из .SECTION линий.
    • удалить текст : function от global декларации
    • удалить default rel линия
    • удалить пустые разделы, если вы хотите, и т. д.
  4. Ссылка в результате main.o который сгенерирован Nasm на шаге 3 с использованием gcc:

    gcc main.o
    

    Вы также можете связать его с помощью ld, но это намного сложнее.

Если вы ленивы: https://github.com/diogovk/c2nasm

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

Вот способ обойтись без objconv

ndisasm -u <(objdump -j .text -d main.o | cut -d: -f2 | cut -d$'\t' -f 2 | perl -ne 'next if /file/; s/\s+//g; print' | xxd -r -p)
Другие вопросы по тегам