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

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

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

Я провожу анализ проекта asm-кода на платформе windows и Linux, поэтому я думаю, что если они могут быть скомпилированы независимым от платформы ассемблером, таким как nasmyasm, у меня может быть гораздо проще...

Итак, мой вопрос заключается в том, как создать 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 оптимизирует, чтобы asm не был ужасным. При необходимости используйте -Os (размер над скоростью) или -O3 (полная оптимизация, включая автоматическую векторизацию). Также вы можете настроить для процессора и и использовать расширения он поддерживает с -march=native или -march=haswell или -march=znver1 (Дзен)

    -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

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