Как создать NASM-компилируемый код сборки из исходного кода c в Linux?
тестовая платформа-32 бит Linux.
в основном, я знаю, что gcc можно использовать для создания как Intel, так и AT&T style код сборки, но кажется, что вы не может непосредственно использовать nasm / tasm для компиляции сгенерированный GCC код сборки стиля Intel.
Я провожу анализ проекта asm-кода на платформе windows и Linux, поэтому я думаю, что если они могут быть скомпилированы независимым от платформы ассемблером, таким как nasmyasm, у меня может быть гораздо проще...
Итак, мой вопрос заключается в том, как создать NASM компилируемый код сборки из исходного кода c в Linux?
2 ответов
я считаю, что лучше разбирать объектные файлы, а не использовать код сборки, сгенерированный gcc.
-
во-первых, генерировать объектный файл из исходного кода:
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
-
использовать objconv для создания
nasm
код:objconv -fnasm main.o
результат будет сохранен в
main.asm
. -
результат будет очень близок к синтаксису Nasm. Однако вам может потребоваться сделать некоторые незначительные настройки, чтобы устранить предупреждения / ошибки. Просто попробуйте скомпилировать его с помощью Nasm
nasm -f elf32 main.asm
и исправить ошибки/предупреждения вручную. Например:
- удалить
align=N
иexecute
/noexecute
слова.SECTION
строки. - удалить текст
: function
Сglobal
декларации - удалить
default rel
строка - удалите пустые разделы, если хотите и т. д.
- удалить
-
связать полученный
main.o
который генерируется Nasm на Шаге 3 с помощью gcc:gcc main.o
вы также можете связать его с помощью ld, но это намного сложнее.
Если вы ленивы: https://github.com/diogovk/c2nasm
там у меня есть сценарий, который делает предложение Бабкена Варданяна автоматически.