Как создать 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
там у меня есть сценарий, который делает предложение Бабкена Варданяна автоматически.