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

Тестовая платформа - это 32-разрядная Linux.

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

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

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

Ответы

Ответ 1

Я считаю, что лучше разбирать объектные файлы, чем использовать ассемблерный код, сгенерированный 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: уменьшить размер исполняемого файла (полосы)

    -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, но это намного сложнее.

Ответ 2

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

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

Ответ 3

Вот способ сделать это без 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)